return boost :: shared_ptr вопрос, почему деструктор вызывали 3 раза - PullRequest
0 голосов
/ 05 октября 2010
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();
}

Выход:

*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*

1 Ответ

0 голосов
/ 05 октября 2010

Когда возвращается createObjA, shared_ptr выходит из области видимости и уничтожает объект.Теперь вы возвращаете неверный указатель.

Конструктор Obj_B берет копию указателя.Когда этот объект уничтожается, shared_ptr будет пытаться уничтожить его снова.

Когда main() выходит, третий shared_ptr уничтожается и делается другая попытка уничтожить недопустимый указатель.

...