繁体   English   中英

我是否正确删除了该指针?

[英]Am I deleting this pointer correctly?

我有以下代码:

LPWSTR pszDSPath = NULL;
pszDSPath = new WCHAR[  wcslen(pwszFilter)+
                        wcslen(wstrServer.c_str())+
                        wcslen(var.bstrVal) +
                        1
                     ];

// ....
// ....

if(pszDSPath)
{
    delete pszDSPath; 
    pszDSPath = NULL;
}

上面的代码会产生内存泄漏吗? 我不确定是否要正确删除pszDSPath

您没有使用正确的delete new形式有两种:创建单个对象的标量new (例如new int )和创建数组的new数组(例如new int[42] )。

同样, delete有两种形式: deletedelete[] 如果使用new ,则必须使用delete销毁对象;如果使用new[] ,则必须使用delete[]销毁对象。

由于您已使用new[]创建pszDSPath指向的对象,因此必须使用delete[] pszDSPath销毁该对象。

但是请注意,如果您仅使用std::vector ,这将变得更加容易:

std::size_t n = wcslen(pwszFilter)+
                wcslen(wstrServer.c_str())+
                wcslen(var.bstrVal) +
                1;

std::vector<WCHAR> v(n);

// &v[0] can be used as you are using pszDSPath in your current code.

在C ++中,您应该避免手动进行内存管理:正确设置非常困难,并且需要大量工作。 C ++标准库中有一些库工具,包括诸如std::vectorstd::map类的容器以及诸如std::auto_ptrstd::unique_ptrstd::shared_ptr类的智能指针,它们可以为您管理对象生存期。 您不应该做比您需要做的更多的工作:如果您认为必须在代码的某处编写delete ,则您的代码可能是错误的。

使用容器来管理资源生存期的这一原理基于一种称为范围限制资源管理(SBRM)或资源获取即初始化(RAII)的设计模式。

std::unique_ptr是C ++ 0x的一部分,旨在替代std::auto_ptr ,并且您的编译器可能尚未支持它std::shared_ptr也是C ++ 0x的一部分,但已可用于作为Boost库的一部分(作为boost::shared_ptr )大约十年,并包含在C ++ TR1中。)

预先分配数组时,请使用delete[] pszDSPath避免内存泄漏。

使用delete[]避免未定义的行为。

但是,在这种情况下使用delete 几乎永远不会单独导致内存泄漏 -它只会起作用,或者会导致比内存泄漏更严重的事情。 不要冒险使用delete[]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM