如何释放函数内部分配的任何动态内存
How can I free any dynamic memory allocated inside a function?
我正在处理一个问题,有人要求我创建一个返回指针的函数。我写的程序运行良好;然而,我在名为*newArray
的函数中创建了动态内存分配,我认为我没有释放指针ptr2
在该函数中指向的已分配内存。有没有办法释放这种记忆?
我想在函数中添加另一个参数——主函数中的ptr2
指针——然后在函数内部更改该指针,但这违背了函数返回指针的目的。有什么想法吗?
这是我的代码:
//Problem #12
#include <iostream>
using namespace std;
void SizeEntry(int*);
void DataEntry(int*, int);
void ShowArray(int *, int);
int *newArray(int *, int);
int main()
{
int size, new_size;
int *ptr=nullptr, *ptr2 = nullptr;
//grab size and dynamically allocate an array to the entered size
SizeEntry(&size);
ptr = new int[size];
//make size of second array
new_size=size+1;
//Fill array with data and make a new copy w/ requirements
DataEntry(ptr, size);
ptr2 = newArray(ptr, size);
cout<<"nHere is the first array: n";
ShowArray(ptr, size);
cout<<"Here is the new array: n";
ShowArray(ptr2, new_size);
//free allocated array
delete [] ptr;
delete [] ptr2;
ptr = nullptr;
ptr2 = nullptr;
return 0;
}
void SizeEntry(int *size)
{
cout<<"Enter the size of your list: ";
cin>>*size;
while(*size<0)
{
cout<<"Size must be non-negative, enter another number: ";
cin>>*size;
}
}
void DataEntry(int *ptr, int size)
{
for(int count = 0; count<size; count++)
{
cout<<"Enter data for entry #"<<(count+1)<<": ";
cin>>*(ptr+count);
while(*(ptr+count)<0)
{
cout<<"Data point cannot be negative, try again: ";
cin>>*(ptr + count);
}
}
}
void ShowArray(int *ptr, int size)
{
for(int count=0; count<size; count++)
cout<<*(ptr+count)<<" ";
cout<<endl;
}
int *newArray(int *ptr, int size)
{
int *ptr2=nullptr;
int new_size = size+1;
int counter=0;
ptr2 = new int[new_size];
for(int count=0; count<new_size; count++)
{
if(count==0)
ptr2[count]=0;
else
{
ptr2[count]=ptr[counter];
counter++;
}
}
return ptr2;
}
您正在释放main中的ptr2。为此,您将函数的prt2与返回值一起赋值。所以两个指针都指向同一个内存,这就是指针的思想。当您在main中释放ptr2时,您会自动释放函数中的ptr2,因为它们是相同的-->请参阅您的赋值。因此,从我的角度来看,现在内存分配存在问题。
要释放C++中"new Operator"分配的内存,只需使用delete运算符,而不使用其他运算符
不需要为其内存已被delete运算符释放的指针分配null。
PS:如果您打算再次使用该指针,请将其指定为NULL。
因此,在您的情况下,最后两行代码是无用的,除非您打算再次使用该指针。
//free allocated array
delete [] ptr;
delete [] ptr2;
ptr = nullptr; //Useless as memory is already free assigned to ptr
ptr2 = nullptr;//Useless as memory is already free assigned to ptr2
在*newArray函数中,您将返回一个指针,即ptr2。
当您返回ptr2时,将生成ptr2的值(地址)的副本并返回给调用者。ptr2已声明为具有自动存储持续时间。必须释放它所指的内存,并且您在main中执行此操作,因为*newArray的ptr2被分配给main函数的ptr2。
附言:如果你有任何疑问,在Visual Studio中调试它,你会得到清晰的想法
来吧,我认为这里没有任何问题。但我认为值得告诉你的是,main函数中的ptr2是由newArray函数的返回指针分配的,并且main-ptr2在逻辑上与newArray-ptr2相同。
当我说"合乎逻辑"时,我的意思是它们当然指向不同的指针。指针也是可变的,所以main-ptr2和newArray-ptr2是两个不同的指针,它们存储在内存的不同位置。然而,它们具有相同的值,这是内存中其他变量的地址信息。具有相同的值意味着它们指向相同的内存块。
我和我哥哥是两个不同的人,我指着一个漂亮的女人告诉我哥哥"嘿,看看那个漂亮的女人!"现在,我哥哥也指着那个漂亮的女士。
所以,两个指针,一个目标。如果您尝试在main中使用delete ptr2
释放目标,那么main-ptr2和newArray-ptr2所指向的目标将被销毁。
顺便说一句,newArray-ptr2实际上已经不存在了,因为它是newArray函数的一个自动变量。
从低级内存细节的角度来思考。在newArray函数中,您通过new分配内存块,并将该块的基地址分配给ptr2指针。
然后,您从newArray函数返回ptr2指针,并将该指针分配给main()内部的ptr2指针。
最终,您可以通过delete语句释放您持有的内存块,其中您告诉机器释放ptr2所指向的连续分配的内存块。
我看不出有任何内存泄漏的原因。为了更好地理解,我建议通过调试器(gdb)运行您的这个程序。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 尝试摆脱任何堆内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 使用运营商New分配的数据结构是否有任何副作用
- 我可以将指针作为指针转向课程,以便我可以使用分配给同类指针的任何内容
- 友元函数将内存分配给数组成员是否有任何限制?
- 分配运营商为什么返回任何开始
- c++:何时初始化声明的变量而不将其分配给任何值
- 如果使用#Define而没有任何分配值,它将做什么
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- getline 没有为字符串对象分配任何值
- 调用构造函数,而无需将其分配给任何变量C
- 对于数据成员,如果包含对象已在动态内存中,则动态分配此变量(或不动态分配)之间是否有任何区别
- 动态分配 2D 数组,无需使用任何循环
- CORBA::String_var -> 我无法为这种类型的类字段分配任何值
- 不分配任何字符内存的常量字符串构造函数?
- 仅通过指针强制转换使类类型可互换,而无需分配任何新对象
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 如何创建可以在 c++ 中分配任何类型的对象
- 为什么我不能再为数组分配任何东西