首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回boost::shared_ptr问题,为什么析构函数被调用了3次

返回boost::shared_ptr问题,为什么析构函数被调用了3次
EN

Stack Overflow用户
提问于 2010-10-05 19:36:45
回答 1查看 991关注 0票数 0
代码语言:javascript
运行
复制
class Obj_A {
public:
    ~Ojb_A() {
         cout << "calling Obj_A() destructor\n";
     }
    void method1() {
         cout << "invoking Obj_A::method1()\n";
    }
};

class Obj_B {
    boost::shared_ptr<Obj_A> _objA;
public:
    Obj_B(Obj_A *objA) {
        _objA.reset(objA)
     }

    void method1() { _objA->method1(); }
};

class ObjAFactory {
public 
    static Obj_A* createObjA();
};

Obj_A* ObjAFactory::createObjA() {
    boost::shared_ptr<Obj_A> objA(new Obj_A());
    return objA.get();
}

void main() {
    boost::shared_ptr<Obj_A> objA(ObjAFactory::createObjA());
    Obj_B objB(objA);
    objB.method1();
}

输出:

代码语言:javascript
运行
复制
*calling Obj_A() destructor
invoking Obj_A::method1()
calling Obj_A() destructor
calling Obj_A() destructor
a.out in free(): warning: page is already free
a.out in free(): warning: page is already free*
EN

回答 1

Stack Overflow用户

发布于 2010-10-05 19:47:12

createObjA返回时,shared_ptr超出作用域并销毁对象。您现在返回一个无效的指针。

Obj_B构造函数正在获取指针的副本。当该对象被销毁时,shared_ptr将再次尝试销毁它。

main()退出时,将销毁第三个shared_ptr,并再次尝试销毁无效指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3867060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档