2

些細な質問であることはわかっていますが、その理由を知る必要があります。

によってコンパイルされた次のコードは失敗しました

a.out(93143) malloc: *** error for object 0x7fff5af8293f: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

コード:

#include <iostream>

using namespace std;

class A
{
};

class B
{
    private:
        A a;
    public:
        B(){a=*new A();}
        ~B(){delete &a;}
};

int main()
{
    B b;
}

即時のコメントによると、「new」で動的に割り当てられたオブジェクトは、「a」に割り当てた後、すぐに所有者を失ったことに気付きました。「A」へのポインターではなくオブジェクトが必要な場合、最善の解決策は何ですか?

4

1 に答える 1

12

メンバー変数はポインターではないためです。A a;動的に割り当てられたオブジェクトのコピーを割り当て、動的に割り当てられたオブジェクトをリークしていません。

クラス B を次のように変更します。

class B
{
    private:
        A* a;
    public:
        B(){a= new A();}
        ~B(){delete a;}
};

またはさらに良い

class B
{
    private:
        A a;
    public:
        B() {}
        ~B(){}
};

動的に割り当てられたオブジェクトが本当に必要な場合に備えて、スマート ポインターを使用したこの最終的な解決策を提案したいと思います (これには C++11 または boost が必要です)。

#include <memory>
#include <iostream>

class A
{
public:
    A() { std::cout << "Hi" << std::endl; }
    ~A() { std::cout << "Bye" << std::endl; }
};

class B
{
public:
    B(): a(new A()) {};
    //~B() {} <-- destructor is no longer needed, the unique_ptr will delete the object for us
private:
    std::unique_ptr<A> a;
};

int main(int argc, char* argv[])
{
    B b;
}

A のコンストラクタとデストラクタがここで呼び出されていることがわかります。

于 2013-07-18T17:56:29.237 に答える