1

次の問題があります:

ビルトインで std::vector を使用するとメモリが得られませんが、クラスを使用するとメモリリークが発生します。説明する:

//No leak
std::vector<double>* vecPtr1=new std::vector<double>();
//add some elements
delete vecPtr1;

//Leaks some memory but not all
std::vector<SomeClass>* vecPtr2=new std::vector<SomeClass>();
//add some elements with vecPtr2->push_back(SomeClass());
delete vecPtr2;

私が理解している限り、delete は std::vector のデストラクタを呼び出す必要があり、次に SomeClass のデストラクタを呼び出す必要があります -> リークはありません。これにいくつかの考えとテストを投資しましたが、次のようなスコープで std::vector を使用すると同じ動作が発生します。

{
  std::vector<SomeClass> vector;
  //add elements as before
}
//memory is still used here

Ubuntu 11.10 で gcc 4.6.1 を使用しています。私のライブラリに何か問題がありますか、それとも std::vector が要素を破壊する方法を誤解していますか?

明確にするために、SomeClass を std::pair に置き換えた完全なコードを示します (はい、いくつかの部分がハッキングされていることは知っていますが、これは単なる例です)。

#include <iostream>
#include <vector>
#include <utility>

int main()
{
    std::string inString;
    std::cout<<"Started"<<std::endl;
    //wait
    std::cin>>inString;
    {
        //assign vector
        std::vector<std::pair<std::string,unsigned int> > vec=std::vector<std::pair<std::string,unsigned int> >();
        //push elements
        for(unsigned int i=0;i<1e7;++i)
        {
            vec.push_back(std::pair<std::string,unsigned int>("something",i));
        }
        std::cout<<"Created vector with capacity: "<<vec.capacity()<<std::endl;
        //wait
        std::cin>>inString;
    }
    //vec should go out of scope but not all memory gets freed
    std::cout<<"Deleted vector"<<std::endl;
    //wait
    std::cin>>inString;
    std::cout<<"Shutting down"<<std::endl;

    return 0;
}
4

3 に答える 3

7

まず、ベクトルのオブジェクトを動的に作成しないでください。それは単に悪い考えです。つまり、自動ベクトルを使用します。

std::vector<SomeClass> classes; //automatic object

とにかく、あなたの場合、問題は class にあると思いますSomeClass

このクラスはメモリを管理し、次の少なくとも 1 つを適切に実装していないと思います。

  • コピーコンストラクター
  • コピー代入
  • デストラクタ

C++11 を使用している場合は、さらに 2 つのメンバーがあります。

  • 移動コンストラクター
  • 移動割り当て

これらを読むことをお勧めします:

于 2012-06-04T09:10:14.437 に答える
3

SomeClass正しいデストラクタが実装されていれば、そこにリークはないはずです。

コピー コンストラクターと代入演算子は実装されていますか? デストラクタは、所有するすべてのメモリをクリアしていますか?

また、メモリリークしていることをどうやって知るのですか。Valgrind や Purify などのツールを使用していますか、それとも単にメモリの場所を見ているだけですか?

于 2012-06-04T09:11:26.517 に答える
0

問題は「SomeClass」です。

破壊時に解放されないメモリを割り当てる可能性が非常に高いです。「SomeClass」を公開するとITが役立ちます

于 2012-06-04T09:14:49.533 に答える