读书人

成员函数中删除当前实例后的有关问题

发布时间: 2013-01-04 10:04:18 作者: rapoo

成员函数中删除当前实例后的问题
当成员函数删除当前实例的时候,一般应该怎么停止后面的代码执行。
先上代码:


#include <iostream>
class A;
void callfun(int i,A *pt);

class A {
public:
A() { sss="this is A."; }
virtual ~A() {}
void foo(int i) {
callfun(i,this);  //调用函数,如果条件符合会删除当前实例
out();       //输出内容
}
private:
void out() {
std::cout<< "Out:" <<std::endl;
std::cout<< sss << std::endl;
}
std::string sss;
}

void callfun(int i,A *pt) {
if (i==0)
delete pt; //条件符合时,删除实例
}

int main() {
A *a1=new A;
a1->foo(1); //这行打印:Out:this is A.
a1->foo(0); //这行删除a1,不打印,但是事实它还是会打印的。请问如何解决?
}

我希望执行的效果是foo(1)时打印,foo(0)时删除条件成立,删除实例,不再打印。请指教。
[解决办法]
代码我拷贝过去,怎么总是不对,有不认识的字符,但是找不出哪个字符不对。
[解决办法]
你确定你的程序没有出错。你delete this 后然后继续调用out, out里面还输出sss 程序没有挂掉?
[解决办法]
新手学习了啊
[解决办法]
让 callfun 删除时返回 1,foo 里面监测返回值,是 1 的话立即返回吧。即便这样也有问题,因为严格来讲,delete this 以后就不能调用成员函数了,不过你这个好像也不算调用,而是返回到成员函数,总之很 tricky,有空翻翻标准,看看是不是 UB. 不明白楼主为什么要这么设计,同样的删除逻辑放在 main 里面不是更好吗。
[解决办法]
自己的成员函数里干掉自己,相当于使用已经收回的堆内存 ,
这是不正确的,哪怕当时输出没有问题也有很大隐患。

详情科普 野指针.




[解决办法]
VS2010里面已经报了内存错误。而已delete了后一般要将指针指向NULL。你这样已经成了野指针
[解决办法]
引用:
引用:VS2010里面已经报了内存错误。而已delete了后一般要将指针指向NULL。你这样已经成了野指针

我实际的代码并没有产生野指针问题。事实这是从另一些代码中抽出来的。而在这些实际的代码中他并不会产生问题,原因是,class A其实在另一个类class B中被创建,void foo(int i)会调用class B中的函……

delete this; 本身没问题,只是很危险,看看这个 http://www.parashift.com/c++-faq-lite/delete-this.html
[解决办法]
将类的实例析构后仍想调用的成员函数声明为static public?

读书人网 >C++

热点推荐