【问题标题】:dynamic memory allocation for auto_ptrauto_ptr 的动态内存分配
【发布时间】:2012-05-30 13:28:10
【问题描述】:

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

【问题讨论】:

  • new std::auto_ptr 违背了 auto_ptr 的目的。
  • @Pubby:不过,这是一个动态大小的 auto_ptr 数组。或者,如果5 不是硬编码常量,它会是。动态大小的数组不会以同样的方式破坏auto_ptr 的目的。

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


【解决方案1】:

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

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

附: std::auto_ptr 有点缺陷。如果您可以访问 VS2010,我建议您使用std::shared_ptr

附言如果你想测试 NULL,你应该总是初始化指向 NULL 的指针,它们不是默认的。 std::auto_ptr&lt;HANDLE&gt; *eventHandle = NULL;

【讨论】:

  • std::shared_ptr 比 auto_ptr 贵一点。它是 std::unique_ptr,它是 C++11 对 auto_ptr 的更直接替代。
  • 最重要的是,使用shared_ptrunique_ptr,您可以摆脱讨厌的new[],并使用漂亮的std::vectorstd::array 智能指针。跨度>
  • @SteveJessop 绝对是,这是与标准容器不兼容的许多 auto_ptr 缺陷之一。
【解决方案2】:

这里

std::auto_ptr<HANDLE> *eventHandle;

您有一个原始指针,因此当您重新分配它时,之前的值将被覆盖,并且之前指向的 auto_ptr 类型的对象数组被泄露。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 2021-02-15
    • 2013-07-01
    相关资源
    最近更新 更多