C++这会导致内存泄漏吗?

And*_*rew -3 c++ memory-leaks

我试图理解delete []的用法.以下代码是否会发生内存泄漏?

int * getArray( )
{
    int *r = new int[10];
    for (int i = 0; i < 10; ++i)
        r[i] = i;
    return r;
}

int main ()
{
    int *array;
    for ( int i = 0; i < 10; i++ ) // main loop
        array = getArray();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

主循环似乎是为10个数组分配内存,其中只有最后一个数组有一个有效的指针.如果这是内存泄漏,我如何释放存储前9个阵列的内存?

我也可以用来const int r[10];代替编译int *r = new int[10];.可以使用const避免内存泄漏吗?

Jam*_*son 6

每次调用new必须与调用配对delete以避免内存泄漏(或new[]delete[]).

如何删除内存取决于你正在做什么,但由于你没有保持访问超出for循环,那么你可以轻松地在for循环体内删除它.

for (int i = 0; i < 10; ++i)
{
    array = getArray();
    /* do  something with 'array' */
    delete[] array;
}
Run Code Online (Sandbox Code Playgroud)

更好的是,为什么不使用std::vector<int>并避免直接执行任何内存分配?

编辑: 正如@Niall在评论中提到的那样,你也应该熟悉std::unique_ptr(假设你是编译器支持它).它使用RAII(维基百科链接,cppreference链接)来自动处理内存管理.例如,一旦类超出范围std::unique_ptr<int[]>,它将自动调用delete[].