删除在向量上的传播
Propagation of delete on vector
如果我delete
指针向量,delete
调用其中的指针吗? 例如:
vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;
在此之后,Obj
是否也被删除?
当向量被破坏时,它会破坏每个包含的元素。指针在销毁时不会执行任何操作,因此内存会泄漏,并且不会单独调用delete
指针。
更好的解决方案是使用std::unique_ptr
vector<std::unique_ptr<Obj> >
unique_ptr
将在销毁时删除它指向的对象。
不,它没有。 如果你考虑向量是如何工作的,它是有道理的。 向量动态分配内存以存储其元素,然后将它们复制到其中。
它不知道自己的类型是什么,所以当它调用内部存储器上的delete
时,它是在用于存储每个指针的内存上调用删除,而不是指针所指的内存。 例如,如果你写了类似...
int **a = new int*[10];
for(int i = 0; i < 10; ++i)
a[i] = new int(i);
delete [] a;
a
已解除分配,但每个指针引用的内存呢? 它被泄露了;您只释放了用于存储指针本身的内存。 即使它确实尝试了像你问的那样的事情,你也不会想要它。 向量怎么可能知道给定指针引用的内存是否可以安全地调用delete
? 不能。
这就是为什么你不应该使用指针向量。相反,更喜欢智能指针的向量,即
std::vector<unique_ptr<my_type>> vec;
不,您应该遍历向量并删除其中的元素。
boost 库有 ptr_vector
: http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_vector.html
对于你来说,这正是这样做的。
vector
本身只会激活它立即包含的对象的去色元。在这种情况下,它包含一个没有destroctor的原始C指针。
复制自 stl_vector.h 中 ~vector() 的文档:
The dtor only erases the elements, and note that if the
elements themselves are pointers, the pointed-to memory is
not touched in any way. Managing the pointer is the user's
responsibility.
所以,没有。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 删除在向量上的传播
- 提升精神业力 - 具有约束和传播失败的字符串的输出向量
- std::向量中的值传播
- 图上的c++反向传播异构的向量