2016-12-10 27 views
-1

unique_ptrを試して、メモリ管理がC++でどのように動作するかを確認してください。std :: unique_ptrを使用した場合のメモリリーク

Ding.h

#pragma once 
class Ding 
{ 
public: 
    int value; 
    Ding(); 
    ~Ding(); 
}; 

Ding.cpp

#include "stdafx.h" 
#include "Ding.h" 
#include <iostream> 

Ding::Ding() 
{ 
    value = 90000; 
    std::cout << "Constructor for ding called."; 
} 


Ding::~Ding() 
{ 
    std::cout << "Destructor for ding called."; 
} 

MAIN.CPP

#include "stdafx.h" 
#include <memory> 
#include "Ding.h" 

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

int main() 
{ 
    std::cout << "starting." << std::endl; 
    std::vector<std::unique_ptr<Ding>> dingen; 
    for (int i = 0; i < 10; i++) 
    { 
     std::unique_ptr<Ding> toAdd(new Ding); 
     dingen.push_back(std::move(toAdd)); 
    } 
    std::cout << "ending" <<std::endl; 

    _CrtDumpMemoryLeaks(); 
    return 0; 
} 

私はこのコードを実行すると、私はデバッグ出力ビューでメモリエラーを見ることができます:

Detected memory leaks! 

Dumping objects -> {151} normal block at 

0x00000155B0798140, 104 bytes long. Data: <    > 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 {144} normal block at 
0x00000155B07A2300, 16 bytes long. Data: < S    > 08 FB 53 
D3 14 00 00 00 00 00 00 00 00 00 00 00 Object dump complete. 

これらのリークは何が作成されますか?

編集:dasblinkenlightの回答で述べたとおり、私は(新しいDing)を使用する必要があります。漏れを見つけようとすると、その部分を慎重に削除しました。それはメモリリークを解決しないが、dingのコンストラクタとデストラクタを呼び出すので、質問に追加しました。

+1

実際にオブジェクトを作成しないので、コンストラクタまたはデストラクタからの出力は得られません。 –

+3

まず最初に、 'Ding'オブジェクトを作成することはありません。 (あなたは何をあなたがしたと思ったのですか?)しかし、あなたのコードにも漏れはないので変です。 –

+0

なぜ私はそれがメモリリークを検出するのだろうか。おそらくすべてがスタックに残っているからでしょうか? _CrtDumpMemoryLeaks()を除くすべてをラップして中括弧で囲むと、問題が解決する可能性があります。 –

答えて

10

std :: vectorからリークが発生しています。

int main() { 
    { // Open new scope 
     std::cout << "starting." << std::endl; 
     std::vector<std::unique_ptr<Ding>> dingen; 
     for (int i = 0; i < 10; i++) 
     { 
      std::unique_ptr<Ding> toAdd; 
      dingen.push_back(std::move(toAdd)); 
     } 
     std::cout << "ending" <<std::endl; 
    } // Close the scope 

    _CrtDumpMemoryLeaks(); 

    return 0; 
} 
5

コードではDingオブジェクトが作成されないため、コンストラクタは呼び出されません。 std::unique_ptr<Ding> toAdd;はヌルポインタを保持するunique_ptrオブジェクトを作成します。 Dingオブジェクトは作成されません。作成するには、operator new

std::unique_ptr<Ding> toAdd(new Ding); 
+0

おっと、リークを探しているときにコードを少し変更しましたが、リークを作成するのは何ですか?私はそれに応じて私の質問を更新した。 –

関連する問題