繁体   English   中英

如何释放函数内部分配的任何动态内存?

[英]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;
}

您正在主要释放 ptr2。 为此,您之前将函数的 prt2 分配给您的返回值。 所以两个指针都指向同一个内存,因为这是指针的想法。 当您在 main 中释放 ptr2 时,您会自动在您的函数中释放 ptr2,因为它们是相同的 --> 参见您的分配。 所以从我的角度来看,现在分配的内存存在问题。

来吧,我看这里没有任何问题。 但是我觉得值得告诉你的是,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++ 中“新运算符”分配的内存,只需使用删除运算符即可。

不需要为已被删除操作符释放内存的指针赋值。

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 中调试它,您将获得清晰的 Idea。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM