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

时间:2016-03-29 05:11:06

标签: c++ pointers memory dynamic allocation

我正在处理一个问题而且我被要求创建一个返回指针的函数。我写的程序运行良好而且全部;但是,我在我的函数*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;
}

4 个答案:

答案 0 :(得分:1)

你正在释放主要的ptr2。为此,您可以使用返回值分配函数的prt2。所以两个指针指向相同的内存,因为这是指针的想法。 当您在main中释放ptr2时,您会自动释放函数中的ptr2,因为它们是相同的 - &gt;看你的任务。所以从我的观点来看,现在分配的内存存在问题。

答案 1 :(得分:0)

来吧,我在这里看不到任何问题。但我认为值得告诉你的是,main函数中的ptr2由newArray函数的返回指针赋值,而main-ptr2在逻辑上与newArray-ptr2相同。

当我说“逻辑上”时,我的意思当然是指向不同的指针。指针也是可变的,因此main-ptr2和newArray-ptr2是两个不同的指针,它们存储在内存中的不同位置。但是,它们具有相同的值,这是内存中某些其他变量的地址信息。具有相同的值意味着它们指向相同的内存块。

我和我的兄弟是两个不同的人,我指着一个漂亮的女人,并告诉我的兄弟“嘿,看看那美丽的谎言!”,现在,我的兄弟也指着那位漂亮的女士。

所以,两个指针,一个目标。如果您尝试使用main中的delete ptr2释放目标,则main-ptr2和newArray-ptr2指向的目标将被销毁。

BTW,newArray-ptr2实际上不再存在,因为它是newArray函数的自动变量。

答案 2 :(得分:0)

考虑低级内存细节。在 newArray 函数内部,您通过 new 分配内存块,并将该块的基址分配给 ptr2 指针。

然后从 newArray 函数返回 ptr2 指针,并将该指针指定给 main中的 ptr2 指针( )

最终,你通过 delete 语句释放你所拥有的内存块,其中你告诉机器释放由 ptr2 指向的连续分配的内存块。 / p>

我没有看到任何内存泄漏的原因。为了更好地理解,我建议通过调试器(gdb)运行你的程序。

答案 3 :(得分:0)

释放由&#34;新运营商分配的内存&#34;在C ++中,只需使用delete运算符,而不是别的。

无需为已由delete运算符释放内存的指针指定null。

PS:如果您打算再次使用指针,则只能将其指定为空。

因此,在您的情况下,除非您打算再次使用该指针,否则最后两行代码是无用的。

 //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中调试它有任何疑问,您将获得清晰的想法。