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のコンストラクタとデストラクタを呼び出すので、質問に追加しました。
実際にオブジェクトを作成しないので、コンストラクタまたはデストラクタからの出力は得られません。 –
まず最初に、 'Ding'オブジェクトを作成することはありません。 (あなたは何をあなたがしたと思ったのですか?)しかし、あなたのコードにも漏れはないので変です。 –
なぜ私はそれがメモリリークを検出するのだろうか。おそらくすべてがスタックに残っているからでしょうか? _CrtDumpMemoryLeaks()を除くすべてをラップして中括弧で囲むと、問題が解決する可能性があります。 –