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<HANDLE> *eventHandle = NULL;
【讨论】:
std::shared_ptr 比 auto_ptr 贵一点。它是 std::unique_ptr,它是 C++11 对 auto_ptr 的更直接替代。 最重要的是,使用shared_ptr
或unique_ptr
,您可以摆脱讨厌的new[]
,并使用漂亮的std::vector
或std::array
智能指针。跨度>
@SteveJessop 绝对是,这是与标准容器不兼容的许多 auto_ptr 缺陷之一。【参考方案2】:
这里
std::auto_ptr<HANDLE> *eventHandle;
您有一个原始指针,因此当您重新分配它时,之前的值将被覆盖,并且之前指向的 auto_ptr
类型的对象数组被泄露。
【讨论】:
以上是关于auto_ptr 的动态内存分配的主要内容,如果未能解决你的问题,请参考以下文章