0

これは私のプログラムのサンプルコードです。ここでは、std :: auto_ptrを使用して動的にメモリを割り当て、その後、同じ変数にメモリを割り当てています。したがって、以前に割り当てられたメモリは、同じメモリに新しいメモリが割り当てられたときに割り当てが解除されますか。std :: auto_ptrを使用しているので、これについては疑わしいです。前もって感謝します。

  #include "stdafx.h"
  #include <iostream>
  #include <memory>
  #include <windows.h>

  std::auto_ptr<HANDLE> *eventHandle;

  void function()
  {
    eventHandle = new std::auto_ptr<HANDLE>[5];
    std::auto_ptr<HANDLE> handle(new HANDLE);
    *handle = CreateEvent(NULL, false, false, NULL);
    eventHandle[0] = handle;
  }

  void f2()
  {
    if(NULL == eventHandle)
    {
      std::cout<<" HANDLE NULL";
    }
  }

  int _tmain(int argc, _TCHAR* argv[])
  {
    function();
    f2();
    function();
    return 0;
  }
4

2 に答える 2

2

あなたの例では:HANDLEポインターはスマートポインターですが、の配列ではありませんstd::auto_ptr。この場合delete [] eventHandle、2回目の呼び出しの前に呼び出す必要がありますfunction()。これにより、HANDLEスマートポインターも削除されます。

ただし、HANDLEオブジェクトは削除する前にCloseHandle関数で閉じる必要があるため、HANDLEが不要になり、オブジェクトへのポインターを削除する必要がある場合はいつでもわかるので、ここでスマートポインターの必要性に疑問を投げかけます。

PSstd::auto_ptrは少し欠陥があります。VS2010にアクセスできる場合は、を使用することをお勧めしますstd::shared_ptr

PPS NULLをテストする場合は、常にポインタをNULLに初期化する必要があります。デフォルトでは、ポインタは初期化されていません。std::auto_ptr<HANDLE> *eventHandle = NULL;

于 2012-05-30T15:12:00.760 に答える
1

ここ

std::auto_ptr<HANDLE> *eventHandle;

生のポインタがあるので、それを再割り当てすると、前の値が上書きされ、auto_ptr前に指し示したタイプのオブジェクトの配列がリークされます。

于 2012-05-30T13:30:41.200 に答える