C++ 如何释放函数中分配的任何动态内存?
我正在处理一个问题,有人要求我创建一个返回指针的函数。我写的程序非常好;但是,我在名为C++ 如何释放函数中分配的任何动态内存?,c++,pointers,memory,dynamic,allocation,C++,Pointers,Memory,Dynamic,Allocation,我正在处理一个问题,有人要求我创建一个返回指针的函数。我写的程序非常好;但是,我在名为*newArray的函数中创建了动态内存分配,我不认为我正在释放指针ptr2指向该函数的分配内存。有没有办法释放这个内存 我正在考虑向函数中添加另一个参数—来自主函数的ptr2指针—并在函数中更改该指针,但这与函数返回指针的目的背道而驰。有什么想法吗 这是我的代码: //Problem #12 #include <iostream> using namespace std; void SizeEn
*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;
}
//问题#12
#包括
使用名称空间std;
空位大小(整数*);
无效数据项(int*,int);
void ShowArray(int*,int);
int*新数组(int*,int);
int main()
{
整数大小,新的_大小;
int*ptr=nullptr,*ptr2=nullptr;
//获取大小并根据输入的大小动态分配数组
尺寸和尺寸;
ptr=新的整数[大小];
//生成第二个数组的大小
新尺寸=尺寸+1;
//用数据填充数组,并根据需要制作新副本
数据输入(ptr、大小);
ptr2=新阵列(ptr,大小);
cout您正在释放main中的ptr2。为此,您将函数的prt2分配给返回值。因此,两个指针都指向相同的内存,因为这是指针的想法。
当您在main中释放ptr2时,您会自动在函数中释放ptr2,因为它们是相同的-->请参阅您的赋值。因此,在我看来,现在分配的内存存在问题。拜托,我在这里看不到任何问题。但我认为值得告诉您的是,主函数中的ptr2是由newArray fu的返回指针赋值的并且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)运行这个程序。 <强>以释放“new运算符”在C++中分配的内存,只使用DelieldExcor,没有别的。>/P>
无需为其内存已由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
PS:如果您有任何疑问,请在Visual Studio中调试它,您将获得清晰的想法。考虑智能指针当您使用完内存后,您正在使用delete[]ptr2
释放内存。您以前不能释放它。嗨,Sami,那是delete[]ptr2在main中并释放ptr2指针指向的在main中创建的内存,但我也在*newArray函数中创建了另一个。@SamiKuhmonen:他在谈论newArray的内部。他唯一没有做的就是删除[]*newArray中的ptr1。他在其中创建ptr2,从ptr1移走所有内容,但他没有摆脱ptr1。但是,他从newArray()返回后立即在主程序中使用ptr1。因此,如果他释放它-当程序尝试使用它时,它会转储内核。因此,我看不出有什么问题。他确实在主程序中释放了ptr1和ptr2。*耸耸肩,应该可以得到它。它释放指针指向的内存,这是在函数中分配的内存。我认为这段代码没有问题,除了事实上,它使用new
来创建动态数组,这通常是一个糟糕的想法。我不认为这是正确的。但我可能在这里错了。函数newArray()执行一个新命令,该命令不指向与ptr1相同的内存位置。数据可能具有相同的指针,但数组我认为是不同的。嗯,这个:return ptr2;分配给这个:ptr2=newArray(ptr,size);这个ptr2是在main中释放的,那么问题出在哪里呢?他不能在返回指针之前释放它:-)但是由于在main中的ptr2和在newArray函数中的ptr2是相同的,他释放了所有-->我现在只关注ptr2。是的,我认为他的担心是没有道理的。所以我一定是瞎了,因为我