auto_ptr 的动态内存分配

Posted

技术标签:

【中文标题】auto_ptr 的动态内存分配【英文标题】:dynamic memory allocation for auto_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 的目的。 【参考方案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 类型的对象数组被泄露。

【讨论】:

以上是关于auto_ptr 的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章

auto_ptr类

在动态分配的数组上使用 auto_ptr 的正确方法是啥?

STL的内存分配器

STL中的内存分配器原理

c语言中啥是动态分配内存?

C语言中的动态内存分配的用法举例