2017-05-22 20 views
0

スコープの外に出たときにstd :: shared_ptrがメモリを解放しないという印象です。以下は私のテストコードです。私が間違っていることを私に示唆してもらえますか? 私はgtestを使ってテストしています。このテストを実行すると、メモリが絶えず消費されていることがわかります。私はProceedVectorへの各呼び出しはstd::vector<double>オブジェクトの2つの動的割り当てを行い、マイクロソフトVC++ 2013std :: shared_ptr <std :: vector <double>>

void ProceedVector() { 
    std::vector<double> * numbers = new std::vector<double>(); 
    for (int ind = 0; ind != 10000; ind++) { 
     numbers->push_back(ind); 
    } 
    std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers); 
} 

TEST_F(ManagerTypeConvertorTest, ProceedVector) { 
    for (int ind = 0; ind != 50000; ind++) { 
     ProceedVector(); 
    } 
} 
+2

ようこそスタックオーバーフロー。 [The Tour](http://stackoverflow.com/tour)を読み、[ヘルプセンター](http://stackoverflow.com/help/asking)の資料を参考にしてください。ここに聞いてください。 –

答えて

2

を使用しています。ここで一つ:

std::vector<double> * numbers = new std::vector<double>(); 

そしてここで、他の1: "shared_ptrにこのオブジェクトを割り当てる"

std::shared_ptr<std::vector<double>> numbersPtr = std::make_shared<std::vector<double>>(*numbers); 

make_sharedが意味するものではありませんこれは、「これらのパラメータから新しいオブジェクトを割り当て、shared_ptrを使用して新しく割り当てられたオブジェクトを管理する」という意味です。あなたはコードを達成したい内容に応じて

、どちらかmake_shared 1とnewラインを交換し、まったく生のポインタを使用し、またはこれとmake_shared行を置き換えることはありません。

std::shared_ptr<std::vector<double>> numbersPtr{numbers}; 

ことが指すメモリを管理するshared_ptrを構築します。

+0

ありがとうございました。それは助けになった! –

0

あなたはポインタには、2つの異なるベクトルを持っている:

  • (第一のベクターからのコンテンツのコピーを含む共有ポインタ)

  • を削除されますOneとではありません(最初にあなたが作成するベクトルはnewです)。

+0

ありがとうございます。それは今働く –

関連する問題