指向指针数组的指针!如何删除?

5

所以我有一个指向指针数组的指针!

    int **matrixPtr;
    matrixPtr = new int*[5];
    for(i=0; i<5; ++i){
        matrixPtr[i]= new int[5];
    }

我想知道这是否是释放内存的正确方法!
    for(i=0; i<5; ++i){
        delete [] matrixPtr[i];
    }
    delete [] matrixPtr;

谢谢!


你是正确的。无论你使用了多少次"new",就需要删除多少次。 - SwiftMango
3
虽然这不是对问题的回答,请考虑使用std::arraystd::vector来避免完全使用newdelete,以便让你的编程更轻松。请注意不要改变原文意思。 - Marc Claesen
这是数据结构课的一项作业,所以我不能更改实现方式...... - Matt
1
为什么如此害怕手动分配内存?虽然不建议使用,但并不意味着你不能这样做! - SwiftMango
主要是异常安全性。 - Yuushi
2个回答

7

没问题。你按照相反的顺序释放了你分配的内存!我甚至认为没有其他方法可以做到这一点。


1
最好的方法是完全避免手动分配。 - Arne Mertz
2
@ArneMertz 和没有其他人会真正理解内存处理的正确方法。我不认为避免手动分配是“最好的方法”。理解分配过程才是“最好的方法”。 - Michael Haidl
@ArneMertz。使用C++11或C++14并不会阻止我们使用手动分配内存。这取决于开发者的目的。你可以说“如果你想避免手动分配,还有另一种方法”,但这不是“最好的方法”...它只是“一种方法”!但我喜欢你的观点!+1;-) - Wagner Patriota
@kronos 如果你真的需要了解手动内存分配,那么你必须尝试一下。但这应该只是高级水平的东西,因为你只需要它来实现安全、易于使用的组件。问题在于,这种事情通常是在C++学习过程的开始时完成的,当时它可能会带来更多的伤害而不是好处。 - juanchopanza
@WagnerPatriota C++鼓励使用封装将手动资源管理的风险放入自己的类中。C++11/14只提供方便的标准库类,因此不必自己编写。然而,处理资源管理和其他事物(例如某些业务逻辑)违反了SRP原则。 - Arne Mertz

2
是的和不是。是的,如果你必须像你所做的那样手动分配内存,那么这是手动释放内存的正确方法。
但是,你应该避免手动分配和释放内存。如果你被困在C++03中并且没有任何智能指针,你应该使用向量的向量。在C++11中,你有更多的选择,即智能指针和std::array,后者仅在编译时知道内部或外部维度的大小或两者都知道时才能使用。在C++14中,std::dynarray也可能成为一种选择。

是的,我的教练要求按照这种方式完成,否则我会使用更实用的方法! - Matt
@Matt 当然,如果只是为了学习内存管理,那么这就是正确的方法。 - Arne Mertz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接