首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

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

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


#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?

热点排行