2

This is in reference to the discussion in this topic here How to have a char pointer as an out parameter for C++ function

In the code below, where do I free the memory of pTemp? Is it not required? Would things would have changed in anyway if instead of array of chars there was array of integers?

void SetName( char **pszStr )
{
    char* pTemp = new char[10];
    strcpy(pTemp,"Mark");
    *pszStr = pTemp;
}

int main(int argc, char* argv[])
{
    char* pszName = NULL;
    SetName( &pszName );
    cout<<"Name - "<< pszName << endl;
    delete [] pszName;
    cin.get();
    return 0;
}
4

3 回答 3

8

您分配pTemp*pszStr,并pszStr指向pszName

因此,delete [] pzxName根据需要删除分配的内存。

这种混淆是一个很好的例子,说明了为什么你应该避免奇怪的 C 风格的习惯用法和手动内存管理。它会更清楚:

#include <string>
#include <iostream>

std::string GetName() {return "Mark";}

int main() {
    std::string name = GetName();
    std::cout << "Name - " << name << std::endl;
}

没有指针,newdelete需要。

于 2012-08-30T10:32:30.453 回答
3

你不需要。
当您调用时,分配给它的内存将被释放:

delete [] pszName; 

请注意,new/new []返回一个地址,为了避免内存泄漏,您需要在完全相同的地址delete上调用/并且只调用一次delete []

您在上面的代码中拥有的是两个不同的指针(pszNamepTemp),它们指向由 . 返回的相同地址new []。所以叫delete []一个就够了。

在 C++ 中,你最好使用 astd::string而不是char *其他数据类型,你当然可以使用智能指针并为自己节省显式内存管理。

于 2012-08-30T10:32:02.013 回答
1

pTemp,变量本身,一旦函数退出,就会被释放,因为它首先是在堆栈上分配的。指针被放入的数组pTemp通过传递给它的参数保留在函数外部,pszName. 当这个变量中的值被删除时,数组使用的堆内存将被释放。

于 2012-08-30T10:32:08.880 回答