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++不是魔法。这也许很神奇,但它不仅仅是在你背后做的事情。我真的只是想知道向量的行为