メモリリーク:オブジェクトを要素とするvector

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Yperia

メモリリーク:オブジェクトを要素とするvector

#1

投稿記事 by Yperia » 15年前

こんにちは。

以下のコードで、メモリリークが検知されてしまいます。
intsが保持しているアドレスは*aと等しいにも関わらず、deleteしてもメモリリークが発生してしまいます。
どのようにしたら、メモリリークを回避できますでしょうか。
#include <vector>

// メモリリーク用
#ifdef    _DEBUG
#define    _CRTDBG_MAP_ALLOC
#include    <stdlib.h>
#include    <crtdbg.h>
#endif

int main(){
    int *a = new int;

    std::vector<int*> ints;
    ints.push_back(a);

    delete ints[0];


// メモリリーク検査
#ifdef    _DEBUG
    _CrtDumpMemoryLeaks();
#endif
}
検知内容:
 Detected memory leaks!
 Dumping objects ->
 {125} normal block at 0x00214EC0, 4 bytes long.
  Data: < N! > 80 4E 21 00
 Object dump complete.

Justy

Re:メモリリーク:オブジェクトを要素とするvector

#2

投稿記事 by Justy » 15年前

 ints.push_backしたときの内部のバッファが解放されていません。
 
 例えば
[color=#d0d0ff" face="monospace]
{
int *a = new int;
{
std::vector<int*> ints;
ints.push_back(a);
delete ints[0];
}

// メモリリーク検査
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif
}
[/color]
このように intsを破棄するなどすれば内部のバッファも解放されます。

Yperia

Re:メモリリーク:オブジェクトを要素とするvector

#3

投稿記事 by Yperia » 15年前

仰ることが完全に理解できてない(vectorの内部バッファがどうなっているのか分からない)ので、見当違いのことを言ってたらすいません。
内部バッファはintsが破棄されれば解放されるということは、私が記述しましたコードでも、_CrtDumpMemoryLeaks()の後にはちゃんとメモリリークが解消されているということでしょうか。
単に_CrtDumpMemoryLeaks()時点ではメモリリークが起こっていただけで、その後で(何故か)解放できた、という感じなのでしょうか。

MNS

Re:メモリリーク:オブジェクトを要素とするvector

#4

投稿記事 by MNS » 15年前

単純に、
intsが解放されるのはmain関数が終了する時であり、
_CrtDumpMemoryLeaks()が、main関数が終了する前に呼ばれているので、
intsが解放されてないと出力されているだけです。

こういう場合には、_CrtDumpMemoryLeaks()を使うよりも、
冒頭で
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
を呼び出すのが良いと思います。

Yperia

Re:メモリリーク:オブジェクトを要素とするvector

#5

投稿記事 by Yperia » 15年前

>単純に、
intsが解放されるのはmain関数が終了する時であり、
_CrtDumpMemoryLeaks()が、main関数が終了する前に呼ばれているので、
intsが解放されてないと出力されているだけです。


ありがとうございます。
おかげで理解できました。
しかし、となりますと_CrtDumpMemoryLeaks()はメモリリークを検知するというより、使用しているヒープ領域を出力する関数ということになりますね。
int *a = new int;
    _CrtDumpMemoryLeaks();
    delete a;
上記コードでも、確かに検知されてしまいました。
こんなんでメモリリークって言うのかな……;;



_CrtSetDbgFlagというのがあるということをお教えいただき、ありがとうございます。
どういった便利なものがあるのか、というのは探しづらいので、とても助かります。


閉鎖

“C言語何でも質問掲示板” へ戻る