[英]C++: Error deleting array of pointers
调用程序的析构函数时遇到一些问题。 我有以下几种情况:
myModule
是指针数组所在的基类。 myModule_in
是代表带有输入端口的模块的子类(由于没有必要,这里将不显示myModule_out
和myModule_inout
)。 moduleC
是输入端口模块之一( moduleA
和moduleB
是myModule_out
和myModule_inout
)。 MyModule的:
class myModule
{
public:
myPort* secondary_ins[NUM];
myModule() {}
virtual ~myModule()
{
for(int i=0; i<NUM; i++)
{
if(secondary_ins[i])
delete secondary_ins[i];
}
}
virtual void connect(myModule &m) = 0;
};
myModule_in:
class myModule_in : public myModule
{
public:
virtual ~myModule_in() {}
virtual void connect(myModule &m)
{
secondary_ins[ins] = new myPort();
...
}
};
moduleC:
class moduleC : public myModule_in
{
public:
moduleC();
~moduleC() {}
void connect_modules() {...}
};
主要:
int main(...)
{
moduleA mA;
moduleB mB;
moduleC mC;
...
mA.connect(mB);
mB.connect(mC);
...
return 0;
}
这段代码可以正确编译并且可以正常工作,直到执行结束为止,在此我遇到分段错误: delete secondary_ins[i];
从return 0;
被调用return 0;
。 奇怪的是,其他模块的destructor
也被调用,没有任何问题。 从基类继承的指针数组的处理可能有问题吗? 有任何想法吗?
谢谢 :)
当您声明:
myPort* secondary_ins[NUM];
无处保证数组将被初始化为0
。 因此测试:
if(secondary_ins[i])
即使未使用有效的指针初始化元素,析构函数中的可能也会通过。 为了方便修复,只需使用0
(在C ++ 11之前)或nullptr
(从C ++ 11开始)初始化数组即可。
对于真正的解决方案 ,只需结合使用std::vector
或std::array
和std::unique_ptr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.