在哪里释放函数内部创建的动态数组的内存
Where to free up memory of a dynamic array created inside a function
这是参考本主题中的讨论如何将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
分配给*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;
}
不需要指针的new
或delete
。
您不需要。
当您调用时,分配给它的内存将被解除分配
delete [] pszName;
请注意,new
/new []
会为您返回一个地址,为了避免内存泄漏,您需要在完全相同的地址和上只调用delete
/delete []
一次。
上面的代码中有两个不同的指针(pszName
和pTemp
),它们指向new []
返回的同一地址。因此,调用一个delete []
就足够了。
在C++中,您最好使用std::string
而不是char *
,在其他数据类型的情况下,您当然可以使用智能指针,并为自己节省显式内存管理。
pTemp
,变量本身,在函数退出后被释放,因为它最初是在堆栈上分配的。指针被放入pTemp
的数组通过传递给它的参数pszName
在函数外部保持不变。当this变量中的值被删除时,数组使用的堆内存将被释放。
相关文章:
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- c++ 动态内存 堆栈中的分配
- 给定特定内存地址的数组的动态内存分配
- 释放动态内存时C++错误
- 我刚刚了解了C++中的动态内存分配
- 无法删除布尔动态内存分配
- 有没有办法找到动态内存大小,比如大小?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 具有对齐存储的动态内存分配
- 指向数组unique_ptr在调用 release() 后会自动释放动态内存,这是真的吗?
- 在cpp中使用boost-python的python代码是否进行动态内存分配
- 我应该在这个程序中使用静态内存分配还是动态内存分配
- C++ 模板函数中的动态内存分配
- 指向动态内存中结构中的变量时出现问题
- C++具有动态内存分配的 constexpr 函数
- 动态内存分配错误
- 按引用传递和动态内存分配之间的区别是什么