在哪里释放函数内部创建的动态数组的内存

Where to free up memory of a dynamic array created inside a function

本文关键字:动态 内存 数组 创建 释放 函数 内部 在哪里      更新时间:2023-10-16

这是参考本主题中的讨论如何将char指针作为C++函数的out参数

在下面的代码中,我在哪里释放pTemp的内存?是否不需要?如果有一个整数数组而不是字符数组,情况会发生变化吗?

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;
}

您将pTemp分配给*pszStrpszStr指向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

您不需要。
当您调用时,分配给它的内存将被解除分配

delete [] pszName; 

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

上面的代码中有两个不同的指针(pszNamepTemp),它们指向new []返回的同一地址。因此,调用一个delete []就足够了。

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

pTemp,变量本身,在函数退出后被释放,因为它最初是在堆栈上分配的。指针被放入pTemp的数组通过传递给它的参数pszName在函数外部保持不变。当this变量中的值被删除时,数组使用的堆内存将被释放。