0

仮定する:

struct Foo
{
    int _b;
    std::string _name;
};

class Bar
{
public:
    vector<Foo>hold;
};

への呼び出しがhold.clear()デストラクタで行われない場合、それはメモリ リークを意味しますか? 私が知る限りpush_back、元のオブジェクトのコピーを作成するため、ポインターではなくオブジェクトについて話している。

4

2 に答える 2

1

いいえ、メモリ リークはありません。がBarスコープ外になると、そのデータ メンバーholdが破棄std::vectorされ、 が適切に設計されているため、保持しているすべての要素が破棄されます。

struct Foo
{
    int _b;
    std::string _name;
    ~Foo() { std::cout << "Foo destructor"; }
};

class Bar
{
public:
    vector<Foo>hold;
};

int main()

{

  {
    Bar b;
    b.hold.push_back(Foo());
  } // Foo, vector<Foo> and b instances destroyed here

}
于 2012-09-21T05:59:30.663 に答える
1

オブジェクトが破棄されると、そのすべてのメンバーも破棄されます。そのため、Bar の (自動生成された) デストラクタは、要素のデストラクタを呼び出すホールド メンバーのデストラクタを呼び出します。

要約すると、すべてが自動的に破棄されます。これは C++ の保証です。オブジェクトを値で操作している場合、オブジェクトがスコープ外に出ると破棄されることが保証されます。明示的に破棄する必要があるのは、ヒープに割り当てられた (つまり new を使用した) オブジェクトだけです。

于 2012-09-21T06:00:46.050 に答える