2012-03-17 12 views
1

以下は、私が今構築できるベストの「最小の動作例」です。私は、次のコードがメモリをリークするかどうかを理解したいと思います。C++のベクトルのメモリ割り当てを解除する<T>

// Class CTest 
class CTest { 
    vector<int> Elements; 
    CTest (vector<int>&); 
    ~CTest(); 
}; 
CTest::CTest (vector<int>& Elements_) { 
    this->Elements = Elements_; 
} 
CTest::~CTest() { 
} 

// main 
int main (int argc, char *argv[]) { 
    vector<CTest> V; 
    for (auto i = 0; i < 10; i++) { 
    vector<int> U; 
    for (auto j = i; j < i + 5; j++) U.push_back (j); 
    V.push_back (*(new CTest (U))); 
    } 
    // Do whatever 
    return 0; 
} 

私はnewの各呼び出しのためのdeleteの対応する呼び出しがないので、このプログラムは、実際にメモリリークないことを考えで正しいですか?

+0

同じ問題が発生しました:http://stackoverflow.com/q/8839943/46642 –

答えて

3

はい、正しいです。さらに、vectorは既に動的コンテナであり、という別の要素の動的割り当て(コピーするだけ)を実行する理由がないため、コードは「間違っていることを非常に難しくしています」というタイプのコードです。

さらに多くの方法があります。それらのどれもC++の特別な設計上の問題ではありませんが、言語があなたをやめることを止めることに限界があります。いくつかの例:

int main(int argc, char **argv) 
{ 
    new double; // leak 
    delete static_cast<void*>(&argc); // doesn't belong to you 
    int a = *static_cast<int const *>(0x42); // not a valid pointer 

    { T x; x.~T(); } // call destructor of non-existent object 

    { T y; y.~T(); new (static_cast<void*>(&y) T(); } 
        // impossible to recover from exception in T::T() 
} 

幸運なことに、幸いなことに、あなたが想定していないことをやっていることは、ほとんどいつもかなり明らかです。

+0

他の方法のプレイブックの代わりに、Qのコードを修正する方法の例はありません。このスペースの? –

+0

@DavidHeffernan: "ベクトルを使う方法"を意味していますか? "ナ、私はOPがそれを知っていると思います。 –

+0

「C++の特別な設計上の問題はありませんが、言語があなたを止めることに限界があります。」 C++(そしてほとんどの主流言語)がひどい型のシステムを持っていることだけです。より強力な型システムが与えられれば、型チェックによって、あなたが実証したエラーはどれもプログラムに含まれていないことを完全に保証することができます。 – GManNickG

9

はい、メモリリークがあります。 push_backはその引数をコピーするので、元のものは永遠に失われます(ポインタはもうありません)。

0

はい、正しいです。あなたは新しいものでなされた課題の割り当てを解除しません。また、すでに動的コンテナ内に動的割り当てを行う必要はありません。

0

はい、それは漏れていますが、あなたがあまりにも頑張っているからです。

V.push_back(CTest(U)); 

は、任意の漏洩なしに、必要なものを行いますVベクトルを投入するために、このコードを使用して

通常、標準のコンテナがあなたのためにメモリを管理します(リークなし)。あなたは気にする必要はありません。

関連する問題