ページ 11

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

Posted: 2010年8月12日(木) 15:42
by Yperia
こんにちは。

以下のコードで、メモリリークが検知されてしまいます。
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.

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

Posted: 2010年8月12日(木) 16:02
by Justy
 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を破棄するなどすれば内部のバッファも解放されます。

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

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

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

Posted: 2010年8月12日(木) 17:53
by MNS
単純に、
intsが解放されるのはmain関数が終了する時であり、
_CrtDumpMemoryLeaks()が、main関数が終了する前に呼ばれているので、
intsが解放されてないと出力されているだけです。

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

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

Posted: 2010年8月12日(木) 18:20
by Yperia
>単純に、
intsが解放されるのはmain関数が終了する時であり、
_CrtDumpMemoryLeaks()が、main関数が終了する前に呼ばれているので、
intsが解放されてないと出力されているだけです。


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



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

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

Posted: 2010年8月12日(木) 18:21
by Yperia
すいません解決でした。