在 C++ 中,如何删除指向指针向量的指针?

How do you delete a pointer to a vector of pointers in c++?

假设在 class A 中,我有一个指向向量的指针,其中包含指向 class B

的指针
Class A {
    ....
    std::vector<B *>* table;
    ....
}

Class B {
     int var1;
     int var2;
     B (const int _var1, const int _var2){
          var1 = _var1;
          var2 = _var2;
     }
}

如何在其析构函数中删除 class A 中的 table?

我试过了

    ~A()
    {
        for (int i = 0; i < table->size(); i++)
        {
            delete (*table)[i];
        }
        delete[] table;
    }

但由于某种原因它在析构函数中给出了段错误。

感谢您的帮助!

由于析构函数中的 delete[] table 语句,您遇到了分段错误。

仅将 delete[] table; 替换为 delete table;

你的段错误是由这一行引起的:

delete[] table;

告诉编译器你想删除一个数组。 table 不是一个数组,尽管它可能像它一样,它是指向堆上的 单个 对象并调用 delete[](而不是 delete) 因此导致未定义的行为。

根据经验,永远不要使用裸指针。如果您确实使用裸指针,请始终对 delete 使用与 new.

相同的形式

正如评论中所指出的,在现代 C++ 中,你应该 永远不会 有一个装满裸指针的容器(裸指针是不由使用 RAII 的包装对象管理的指针) .

因此,您应该在矢量中使用 std::unique_ptr<B>std::shared_ptr<B> 之类的东西代替 B*。您也不应该有一个 std::vector 指针,而应该将向量复制或移动(如果复制很昂贵)到位。使用智能指针而不是裸指针,希望 不会再发生这种情况 :p.