如何释放函数内分配的任何动态内存?
How can I free any dynamic memory allocated inside a function?
我正在处理一个问题,有人要求我创建一个 returns 指针的函数。我编写的程序运行良好;但是,我在名为 *newArray
的函数内部创建了动态内存分配,我认为我不会释放指针 ptr2
指向此函数内部的已分配内存。有没有办法释放这段记忆?
我正在考虑向函数添加另一个参数 - 来自 main 函数的 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。为此,您之前使用 return 值分配函数的 prt2。所以两个指针都指向同一个内存,因为这是指针的思想。
当您在 main 中释放 ptr2 时,您会自动在函数中释放 ptr2,因为它们是相同的 --> 查看您的作业。所以从我的角度来看,现在分配的内存有问题。
拜托,我看这里没有任何问题。但是我觉得值得告诉你的是,main函数中的ptr2是由newArray函数的返回指针赋值的,main-ptr2在逻辑上等同于newArray-ptr2。
当我说 "logically" 时,我的意思当然是它们指向不同的指针。指针也是可变的,所以 main-ptr2 和 newArray-ptr2 是两个不同的指针,它们在内存中存放在不同的地方。但是,它们具有相同的值,即内存中某个其他变量的地址信息。具有相同的值意味着它们指向相同的内存块。
我和我哥是两个不同的人,我指着一个美女告诉我哥"hey, look at that beautiful lay!",现在我哥也指着那个美女
所以,两个指针,一个目标。如果您尝试释放目标,在 main 中使用 delete ptr2
,则 main-ptr2 和 newArray-ptr2 指向的目标将被销毁。
顺便说一句,newArray-ptr2实际上已经不存在了,因为它是newArray函数的自动变量。
考虑底层内存细节。在 newArray 函数中,您正在通过 new 分配一个内存块,并将该块的基地址分配给 ptr2 指针。
你,然后 return 来自 newArray 函数的 ptr2 指针,并将该指针分配给 ptr2 main() 内部的指针。
最终,您通过 delete 语句释放您持有的内存块,其中您告诉机器释放由 指向的连续分配的内存块ptr2.
我看不出任何内存泄漏的原因。为了更好地理解,我会通过调试器 (gdb) 推荐 运行 你的这个程序。
要在 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 函数中,您正在 returning 一个指针,即 ptr2。
当您 return ptr2 时,会生成 ptr2 值(地址)的副本并 returned 给调用者。 ptr2 被声明为具有自动存储持续时间。必须释放它所指的内存,并且您在 main 中执行此操作,因为 *newArray 的 ptr2 已分配给 main 函数的 ptr2。
PS :如果你有任何疑问,在Visual Studio中调试它,你会得到清晰的想法。
我正在处理一个问题,有人要求我创建一个 returns 指针的函数。我编写的程序运行良好;但是,我在名为 *newArray
的函数内部创建了动态内存分配,我认为我不会释放指针 ptr2
指向此函数内部的已分配内存。有没有办法释放这段记忆?
我正在考虑向函数添加另一个参数 - 来自 main 函数的 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。为此,您之前使用 return 值分配函数的 prt2。所以两个指针都指向同一个内存,因为这是指针的思想。 当您在 main 中释放 ptr2 时,您会自动在函数中释放 ptr2,因为它们是相同的 --> 查看您的作业。所以从我的角度来看,现在分配的内存有问题。
拜托,我看这里没有任何问题。但是我觉得值得告诉你的是,main函数中的ptr2是由newArray函数的返回指针赋值的,main-ptr2在逻辑上等同于newArray-ptr2。
当我说 "logically" 时,我的意思当然是它们指向不同的指针。指针也是可变的,所以 main-ptr2 和 newArray-ptr2 是两个不同的指针,它们在内存中存放在不同的地方。但是,它们具有相同的值,即内存中某个其他变量的地址信息。具有相同的值意味着它们指向相同的内存块。
我和我哥是两个不同的人,我指着一个美女告诉我哥"hey, look at that beautiful lay!",现在我哥也指着那个美女
所以,两个指针,一个目标。如果您尝试释放目标,在 main 中使用 delete ptr2
,则 main-ptr2 和 newArray-ptr2 指向的目标将被销毁。
顺便说一句,newArray-ptr2实际上已经不存在了,因为它是newArray函数的自动变量。
考虑底层内存细节。在 newArray 函数中,您正在通过 new 分配一个内存块,并将该块的基地址分配给 ptr2 指针。
你,然后 return 来自 newArray 函数的 ptr2 指针,并将该指针分配给 ptr2 main() 内部的指针。
最终,您通过 delete 语句释放您持有的内存块,其中您告诉机器释放由 指向的连续分配的内存块ptr2.
我看不出任何内存泄漏的原因。为了更好地理解,我会通过调试器 (gdb) 推荐 运行 你的这个程序。
要在 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 函数中,您正在 returning 一个指针,即 ptr2。
当您 return ptr2 时,会生成 ptr2 值(地址)的副本并 returned 给调用者。 ptr2 被声明为具有自动存储持续时间。必须释放它所指的内存,并且您在 main 中执行此操作,因为 *newArray 的 ptr2 已分配给 main 函数的 ptr2。
PS :如果你有任何疑问,在Visual Studio中调试它,你会得到清晰的想法。