释放对象指针向量指针向量的内存 对象指针指针 对象指针指针 [不要这样做]

Di0*_*i0n 2 c++ pointers vector stdvector delete-operator

首先我动态分配一个对象:

Object* someObject = new Object();
Run Code Online (Sandbox Code Playgroud)

然后我将该指针的地址插入到向量中:

std::vector<Object**> someVector0;
someVector0.push_back(&someObject);
Run Code Online (Sandbox Code Playgroud)

然后我将居住地址的地址插入someVector0到另一个向量中:

std::vector<Object***> someVector1;
someVector1.push_back(&someVector0[0]);
Run Code Online (Sandbox Code Playgroud)

最后,我将上述地址插入someVector1到另一个向量中:

std::vector<std::vector<Object***>*> someVector2;
someVector2.push_back(&someVector1);
Run Code Online (Sandbox Code Playgroud)

然后我使用获得的向量,现在我需要释放分配的内存:

//Do some stuff

//Free memory

Run Code Online (Sandbox Code Playgroud)
    for (int i = 0; i < someVector2.size(); i++) {
        for (int j = 0; j < (*someVector2[i]).size(); j++) {
            delete *(*(*someVector2[i])[j]);
            delete *(*someVector2[i])[j];
            delete (*someVector2[i])[j];
        }
        delete someVector2[i];
    }
Run Code Online (Sandbox Code Playgroud)

我曾怀疑这段代码足以解除分配,但是,我在解除分配时遇到了一些问题。我怀疑我可能已经取消引用了 anullptr但我想不出其他任何东西,我删除指针的方式可能有错误吗?

注意:这是我在较大规模的程序中遇到的问题的简化版本,前面提到的向量都不是不必要的,我不想处理任何副本,不要更改向量的类型。

编辑:

您好,在进行了更多研究并听取了评论之后,我已经醒悟了,尽管我认为没有一个人会认为我的代码以任何方式合理,但我强烈敦促任何可能认为这是一种有效方法的人做任何不做的事情。正如评论已经指出的那样,我对解决方案的尝试表明我不知道自己在做什么,所以请不要这样做;它实际上是无法维护的。相反,正如另一条评论已经指出的那样,请使用智能指针或真正了解代码中发生的情况。

Joh*_*nck 5

对于单个元素,您调用了new一次,但调用delete了 4 次。那是错误的。您只能delete使用您创建的内容new,并且一旦删除就无法再次删除。