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。是的,我认为他的担心是没有道理的。所以我一定是瞎了,因为我