首页 文章

如果我在指向矢量std :: vector <Object *> *的指针上调用“delete”,那么元素也会被删除吗? [重复]

提问于
浏览
0

可能重复:C向量指向对象是否std :: list :: remove方法调用每个被删除元素的析构函数?

如果我有一个std :: vector定义为:

std::vector<Object*>* myObjects;

然后打电话:

delete myObjects;

那么myObjects中的元素也会被删除吗?使用std :: array或任何其他stl容器有什么区别吗?

提前致谢

2 回答

  • 1

    不,这就是原因 .

    考虑这两种情况:

    int a, b, c;
    
    auto stackvec = new vector<int*> { &a, &b, &c };
    auto heapvec  = new vector<int*> { new int, new int, new int };
    
    delete stackvec;
    delete heapvec;
    

    如果在 vector* 上对它们持有的指针调用 vector* 时调用 delete ,则'd be in for a heap of trouble (pun intended) because you'd将自动变量 delete 与第一个 delete 产生未定义的行为(这是一件坏事) .

    当你知道它们被动态分配时,你必须自己手动迭代 vectordelete 指针,或者更好,使用 std::unique_ptr 你永远不需要在任何东西上调用 delete .

    此外,您可能首先不需要指向 vector 的指针,但我知道了您的情况't judge you since I don't .

    对于 std::arraystd::vector ,您需要在编译时知道 std::array 的大小,并且无法在运行时调整大小,但 vector 没有这些限制 .

  • 5
    • 不,你会有内存泄漏 .

    • 不,指针容器不会删除指向的对象 .

    • 使用Boost,它拥有拥有数据的指针容器 .

    • boost::ptr_vector<int>

相关问题