仮定する:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
への呼び出しがhold.clear()
デストラクタで行われない場合、それはメモリ リークを意味しますか? 私が知る限りpush_back
、元のオブジェクトのコピーを作成するため、ポインターではなくオブジェクトについて話している。
仮定する:
struct Foo
{
int _b;
std::string _name;
};
class Bar
{
public:
vector<Foo>hold;
};
への呼び出しがhold.clear()
デストラクタで行われない場合、それはメモリ リークを意味しますか? 私が知る限りpush_back
、元のオブジェクトのコピーを作成するため、ポインターではなくオブジェクトについて話している。
いいえ、メモリ リークはありません。が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
}
オブジェクトが破棄されると、そのすべてのメンバーも破棄されます。そのため、Bar の (自動生成された) デストラクタは、要素のデストラクタを呼び出すホールド メンバーのデストラクタを呼び出します。
要約すると、すべてが自動的に破棄されます。これは C++ の保証です。オブジェクトを値で操作している場合、オブジェクトがスコープ外に出ると破棄されることが保証されます。明示的に破棄する必要があるのは、ヒープに割り当てられた (つまり new を使用した) オブジェクトだけです。