c++ 释放对象指针的矢量指针的矢量指针对象指针的矢量指针对象指针的矢量指针[请勿执行此操作]

3htmauhk  于 2023-03-14  发布在  其他
关注(0)|答案(2)|浏览(174)

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

Object* someObject = new Object();

然后我把这个指针的地址插入到一个向量中:

std::vector<Object**> someVector0;
someVector0.push_back(&someObject);

然后,我将位于someVector0的地址插入到另一个向量中:

std::vector<Object***> someVector1;
someVector1.push_back(&someVector0[0]);

最后,我将前面提到的someVector1的地址插入到另一个向量中:

std::vector<std::vector<Object***>*> someVector2;
someVector2.push_back(&someVector1);

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

//Do some stuff

//Free memory
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];
    }

我曾经怀疑这段代码足够释放了,但是,我在释放的时候遇到了一些问题。我怀疑我可能解引用了一个nullptr,但是我想不出其他的东西,我删除指针的方式是否有错误?
注:这是我在一个大规模程序中遇到的一个问题的简化版本,前面提到的向量都是不必要的,我不想处理任何副本,也不想改变向量的类型。
编辑:
嗨,在研究了更多的东西并听到了评论之后,我已经恢复了理智,即使我不认为有一个灵魂会发现我的代码是明智的,我强烈建议任何可能认为这是做任何事情的有效方法的人不要这样做。正如一个评论已经指出的,我在解决方案上的尝试表明我不知道我在做什么,所以请不要这样做;它实际上是不可维护的,相反,正如另一个评论已经指出的那样,使用smart pointers或者真正了解代码中发生了什么。

5f0d552i

5f0d552i1#

对于一个元素,你调用了new一次,但是调用了delete四次,这是错误的,你只能对你用new创建的东西调用delete,并且一旦删除就不能再删除。

q7solyqu

q7solyqu2#

对于初学者来说,你应该重新设计你的代码,因为它非常混乱和不清楚。
由于Object类型的每个对象仅动态分配一次,因此对于每个操作符new,您仅需要调用一个操作符delete
下面是一个演示程序,说明如何做到这一点。

#include <iostream>
#include <vector>

struct Object
{
    int i;
    ~Object()
    {
        std::cout << "deleting object " << i << '\n';
    }
};

int main()
{
    std::vector<Object **> someVector;
    Object *p_obj1 = new Object{ 1 };
    Object *p_obj2 = new Object{ 2 };

    someVector.push_back( &p_obj1 );
    someVector.push_back( &p_obj2 );

    std::vector<Object ***> someVector1;

    for (auto &p : someVector)
    {
        someVector1.push_back( &p );
    }

    std::vector<std::vector<Object ***> *> someVector2;
    someVector2.push_back( &someVector1 );

    for (const auto p_vector1 : someVector2)
    {
        for (auto ppp : *p_vector1)
        {
            delete **ppp;
        }
    }
}

程序输出为

deleting object 1
deleting object 2

由于向量someVector2包含指向向量的指针,因此基于此范围的for循环

for (const auto p_vector1 : someVector2)

提供存储在向量中的指针类型std::vector<Object ***> *的每个元素。
取消引用此范围中基于for循环的指针

for (auto ppp : *p_vector1)

你会得到指针类型为Object ***的元素,所以要释放一个Object类型的对象,你需要通过两次解引用元素来得到一个指向它的指针

delete **ppp;

相关问题