我正确地删除了这个指针吗?

时间:2011-02-17 06:51:23

标签: c++ visual-c++ memory-management memory-leaks

我有以下代码:

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

同样,有两种形式的deletedeletedelete[]。如果您使用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)或Resource Acquisition is Initialization (RAII)的设计模式。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

然而,在你的情况下使用delete almost never cause a memory leak alone - 要么它会起作用,要么你会得到比内存泄漏更糟糕的东西。不要冒险 - 使用delete[]