当我的程序的析构函数被调用时,我遇到了一些问题。我有这些条款:
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;
时出现分段错误。奇怪的是,其他模块'destructor
也被调用,没有任何问题。也许处理从基类继承的指针数组有什么问题?有什么想法吗?
谢谢:)
答案 0 :(得分:4)
宣布:
myPort* secondary_ins[NUM];
无处可保证数组将被0
初始化。因此测试:
if(secondary_ins[i])
即使元素未使用有效指针初始化,析构函数中的也可能会通过。为了便于修复,只需使用0
(在C ++ 11之前)或nullptr
(从C ++ 11开始)数组初始化。
对于实际修复,只需使用std::vector
或std::array
和std::unique_ptr
的组合。