如何将一个动态数组替换为另一个而不会导致内存泄漏?

时间:2013-09-25 00:39:28

标签: c++ pointers dynamic memory-leaks

这是一个简单的问题,我是初学者,但我想确认一下。

假设我有一个类对象int * data,它指向一个包含5个int的数组。假设我有一个用5个参数替换数据的函数,如下所示。

void replaceData(int a, int b, int c, int d, int e){
    int * temp = new int[5];

    temp[0] = a;
    temp[1] = b;
    temp[2] = c;
    temp[3] = d;
    temp[4] = e;

    data = temp;           
}

我担心这会导致内存泄漏,因为如果数据已经有5个整数,那么它们仍然会浮动。我很想通过以下方式改变它以避免这种情况:

void replaceData(int a, int b, int c, int d, int e){
    int * temp = new int[5];

    temp[0] = a;
    temp[1] = b;
    temp[2] = c;
    temp[3] = d;
    temp[4] = e;

    delete data;     //would this prevent a memory leak? 
    data = temp;
    temp = 0;           
}

非常感谢您的投入!

3 个答案:

答案 0 :(得分:2)

如果data的分配方式与分配temp的方式相同,那么您需要在修改指针之前先释放旧数组 - 否则会导致内存泄漏。< / p>

请注意,如果您分配一个数组(new int[5]),那么您必须释放这样的数组:

delete[] data;

此外,最好使用像std::vector这样的STL容器,而不是手动分配数组,因为所有的内存管理都是为你处理的。

答案 1 :(得分:1)

几乎。

delete运算符用于指向单个对象。您需要执行delete[] data才能使用此功能。在末尾将临时指针归零并没有什么区别。

答案 2 :(得分:0)

如果代码是delete[]而不是delete,则代码是正确的。如果大小是硬编码的,那么使用动态分配的数组是没有意义的(至少在这种情况下不是这样)。只需使用int temp[5];

更好的是,只需使用矢量。然后,这是对std::swap的简单调用。