C++ 如果我叫;删除“;在指向向量std::vector<;的指针上;对象*>;*,这些元素也会被删除吗?

C++ 如果我叫;删除“;在指向向量std::vector<;的指针上;对象*>;*,这些元素也会被删除吗?,c++,memory,allocation,C++,Memory,Allocation,可能重复: 如果我将std::vector定义为: std::vector<Object*>* myObjects; MyObject中的元素也会被删除吗?使用std::array或任何其他stl容器有什么区别吗 提前谢谢 不,您将有内存泄漏 否,指针容器不会删除指向的对象。 使用Boost,它拥有拥有数据的指针容器 boost::ptr_向量 不,您将有内存泄漏 否,指针容器不会删除指向的对象。 使用Boost,它拥有拥有数据的指针容器 boost::ptr_向量 不

可能重复:

如果我将std::vector定义为:

std::vector<Object*>* myObjects;
MyObject中的元素也会被删除吗?使用std::array或任何其他stl容器有什么区别吗

提前谢谢

  • 不,您将有内存泄漏
  • 否,指针容器不会删除指向的对象。
    • 使用Boost,它拥有拥有数据的指针容器
    • boost::ptr_向量
  • 不,您将有内存泄漏
  • 否,指针容器不会删除指向的对象。
    • 使用Boost,它拥有拥有数据的指针容器
    • boost::ptr_向量
  • 不,这就是原因

    考虑以下两种情况:

    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;
    
    inta、b、c;
    auto stackvec=新向量{&a,&b,&c};
    auto heapvec=新向量{new int,new int,new int};
    删除stackvec;
    删除heapvec;
    
    如果在
    vector*
    上调用
    delete
    ,在它们所持有的指针上调用
    delete
    ,那么您将陷入一堆麻烦(双关语),因为您将
    delete
    使用第一个
    delete
    自动变量,这会产生未定义的行为(一件坏事)

    当您知道指针是动态分配的时,您必须手动迭代
    向量
    删除
    指针,或者更好地使用
    std::unique_ptr
    ,并且您不需要调用任何
    删除

    此外,您可能不需要一个指向
    向量的指针,但我不会对您进行评判,因为我不知道您的情况

    至于
    std::array
    std::vector
    ,您需要在编译时知道
    std::array
    的大小,并且不能在运行时调整其大小,但是
    vector
    没有这些限制。

    没有,原因如下

    考虑以下两种情况:

    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;
    
    inta、b、c;
    auto stackvec=新向量{&a,&b,&c};
    auto heapvec=新向量{new int,new int,new int};
    删除stackvec;
    删除heapvec;
    
    如果在
    vector*
    上调用
    delete
    ,在它们所持有的指针上调用
    delete
    ,那么您将陷入一堆麻烦(双关语),因为您将
    delete
    使用第一个
    delete
    自动变量,这会产生未定义的行为(一件坏事)

    当您知道指针是动态分配的时,您必须手动迭代
    向量
    删除
    指针,或者更好地使用
    std::unique_ptr
    ,并且您不需要调用任何
    删除

    此外,您可能不需要一个指向
    向量的指针,但我不会对您进行评判,因为我不知道您的情况


    至于
    std::array
    std::vector
    ,您需要在编译时知道
    std::array
    的大小,并且不能在运行时调整它的大小,但是
    vector
    没有这些限制。

    没有。这就是为什么存在
    std::unique_ptr
    std::shared_ptr
    的原因。如果删除一个未初始化的变量,你也会得到未定义的行为,除非这个变量是全局的或静态的,在这种情况下你可以。我认为避免原始指针是使用容器的好处之一<代码>标准::向量对象
    标准::向量对象会更好;-)为什么要删除任何内容?C++不是魔法。它也许很神奇,但它不仅仅是在你背后做的事情。我真的很想知道矢量鸟的行为。这就是为什么存在
    std::unique_ptr
    std::shared_ptr
    的原因。如果删除一个未初始化的变量,你也会得到未定义的行为,除非这个变量是全局的或静态的,在这种情况下你可以。我认为避免原始指针是使用容器的好处之一<代码>标准::向量对象
    标准::向量对象会更好;-)为什么要删除任何内容?C++不是魔法。这也许很神奇,但它不仅仅是在你背后做的事情。我真的只是想知道向量的行为