下面的问题不是很常见,所以我在网上找不到任何可能有帮助的东西:
我有class parent
,它必须有默认的构造函数和析构函数,我不应该定义关于这两个成员的任何内容。
我需要控制ptr
破坏,只有在它没有被引用时才必须被破坏,这由counter
in控制someclass
。
class parent {
public:
someclass * ptr;
}
class child: public parent {
~child() { //<-- this line
cout<<"in ~child!"<<endl;
if(this->ptr == NULL) cout<<"ptr is NULL"<<endl;
this->ptr->delete_reference(); //<-- here ptr = NULL
}
someclass* get_ptr() {
return this->ptr;
}
}
class someclass {
void delete_reference() {
counter--;
if(counter == 0) delete this;
}
问题是在parent 的默认析构函数中this line
被调用并且确实没有被正确地破坏。ptr = NULL
ptr
有没有办法通过这些限制跳过 ~parent 的调用?
我也尝试删除继承,并有一个parent
in的实例child
,但同样的事情发生了,再次调用父级的析构函数。
此外,我需要ptr
加入,parent
因为有更多的子班,他们需要分享这些信息。
谢谢!
编辑:
好的,据我所知,我在这里出了点问题……问题是 ptr 如何为 NULL。只要我混淆了析构函数调用的顺序,那么问题就不在this line
.
void function() {
child ch1;
for(int i = 0; i<1; i++) {
cout<<iterating<<endl;
do_some_work(ch1);
}
if(ch1->get_ptr() != NULL) cout<<"ptr is OK"<<endl;
return;
//Here is the destructor ~child called (?)
}
int main() {
function();
}
上面的调用是我使用的方式child
。里面do_some_work
其实有很多工作在这里难以描述。
关键是do_some_work
完成后,ptr
就OK了。然后我想析构函数被调用并且ptr
似乎是NULL
.
因此,上面将打印:
iterating
ptr is OK
in child
ptr is NULL
Segmentation fault
修改后有什么解释吗?
非常感谢大家!