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在第二次调用之前function()调用,这也会删除 HANDLE 智能指针。

但是,在删除之前,必须通过CloseHandle函数关闭 HANDLE 对象,因此我在这里质疑智能指针的需要,因为您将始终知道何时不再需要 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 回答