3

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

假设我有一个类对象 int * data,它指向一个由 5 个整数组成的数组。假设我有一个函数可以用 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;           
}

非常感谢您的意见!

4

3 回答 3

2

如果data以与分配相同的方式分配temp,那么是的,您需要在修改指针之前先释放旧数组 - 否则您将出现内存泄漏。

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

delete[] data;

此外,使用 STL 容器std::vector比手动分配数组要好得多,因为所有内存管理都是为您处理的。

于 2013-09-25T00:42:09.917 回答
1

几乎。

delete运算符用于指向单个对象的指针。你需要这样做delete[] data才能工作。最后将临时指针归零并没有什么不同。

于 2013-09-25T00:41:59.227 回答
0

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

更好的是,只需使用向量。然后是一个简单的调用std::swap.

于 2013-09-25T00:42:08.383 回答