auto_ptr的动态内存分配

时间:2012-05-30 13:28:10

标签: c++ memory-management dynamic auto-ptr

这是我的程序的示例代码。在这里,我使用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;
  }

2 个答案:

答案 0 :(得分:2)

在您的示例中:HANDLE指针是智能指针,但不是std::auto_ptr的数组。在这种情况下,您必须在第二次delete [] eventHandle调用之前调用function(),这也会删除HANDLE智能指针。

但是,在删除之前,HANDLE对象必须由CloseHandle函数关闭,所以我在这里质疑智能指针的需要,因为你总是知道何时不再需要HANDLE和指向必须删除该对象。

P.S。 std::auto_ptr有点瑕疵。如果您有权使用VS2010,我建议您使用std::shared_ptr

P.P.S。如果你想测试NULL,你应该总是将指针初始化为NULL,它们不是默认的。 std::auto_ptr<HANDLE> *eventHandle = NULL;

答案 1 :(得分:1)

下面

std::auto_ptr<HANDLE> *eventHandle;

你有一个原始指针,所以当你重新分配时,之前的值就会被覆盖,之前指向的auto_ptr类型的对象数组会被泄露。