C++ 删除在向量上的传播

C++ 删除在向量上的传播,c++,memory-management,vector,C++,Memory Management,Vector,如果我delete一个指针向量,是否对其中的指针调用delete?例如: vector<Obj *> v = new vector<Obj *>(); v.push_back(new Obj()); delete v; vector v=new vector(); v、 向后推(新Obj()); 删除第五条; 在这之后,Obj是否也被删除?否,您应该遍历向量并删除其中的元素。否,您应该遍历向量并删除其中的元素。否,它没有。如果你想一想向量是如何工作的,它是有意义的。向

如果我
delete
一个指针向量,是否对其中的指针调用
delete
?例如:

vector<Obj *> v = new vector<Obj *>();
v.push_back(new Obj());
delete v;
vector v=new vector();
v、 向后推(新Obj());
删除第五条;

在这之后,
Obj
是否也被删除?

否,您应该遍历向量并删除其中的元素。

否,您应该遍历向量并删除其中的元素。

否,它没有。如果你想一想向量是如何工作的,它是有意义的。向量动态分配内存以存储其元素,然后将它们复制到内存中

它不知道它的类型是什么,因此当它在其内部内存存储上调用
delete
时,它在用于存储每个指针的内存上调用delete,而不是指针所指的内容。例如,如果你写了一些像

int **a = new int*[10];
for(int i = 0; i < 10; ++i)
    a[i] = new int(i);

delete [] a;

不,没有。如果你想一想向量是如何工作的,它是有意义的。向量动态分配内存以存储其元素,然后将它们复制到内存中

它不知道它的类型是什么,因此当它在其内部内存存储上调用
delete
时,它在用于存储每个指针的内存上调用delete,而不是指针所指的内容。例如,如果你写了一些像

int **a = new int*[10];
for(int i = 0; i < 10; ++i)
    a[i] = new int(i);

delete [] a;

当向量被销毁时,它会销毁包含的每个元素。指针在被销毁时不会执行任何操作,因此内存会泄漏,并且不会单独调用
delete

更好的解决方案是使用
std::unique\u ptr

vector<std::unique_ptr<Obj> >
向量

unique\u ptr
将在销毁时删除它指向的对象。

当向量被销毁时,它将销毁包含的每个元素。指针在被销毁时不会执行任何操作,因此内存会泄漏,并且不会单独调用
delete

更好的解决方案是使用
std::unique\u ptr

vector<std::unique_ptr<Obj> >
向量

unique\u ptr
将在它被销毁时删除它指向的对象。

boost库具有
ptr\u vector

对你来说就是这样


vector
本身仅激活它立即包含的对象的析构函数。在这种情况下,它包含一个没有析构函数的原始C指针。

boost库有
ptr\u向量:
对你来说就是这样


vector
本身仅激活它立即包含的对象的析构函数。在本例中,它包含一个原始C指针,该指针没有析构函数。

从stl_vector.h中的~vector()文档复制而来:


dtor仅擦除元素,请注意,如果
元素本身就是指针,指向内存的是
没有任何接触。管理指针是用户的职责
责任。


因此,没有。

是从stl_vector.h中~vector()的文档中复制的:


dtor仅擦除元素,请注意,如果
元素本身就是指针,指向内存的是
没有任何接触。管理指针是用户的职责
责任。


所以,没有。

“它不知道它的类型是什么”。什么意思?它完全知道它存储的类型。@Pubby:不,它不知道。它是一个模板类型,底层类型可以是任何类型,实际代码只在编译时生成。当
T
是指针类型时,它无法知道需要以不同的方式对待其内存存储,也无法以合理的方式这样做。它不可能知道给定指针引用的内存是如何分配的,因此它只能执行
delete[]\u my\u buffer通过简单的部分专门化,vector可能具有不同的销毁语义(例如,如果类型是指针,则调用
delete
)。模板知道它们的类型是什么。在vector的例子中,决定对所有类型使用相同的销毁语义(除了bool!),这就是为什么它是这样的。(很抱歉,如果这只是愚蠢的学究主义!)@Pubby:是的,所以它可以专门。。。但事实并非如此,所以我说的是真的。我想你说的是模板作为一种功能,而我说的是
std::vector
。然而,我们可以进一步争论,因为您说“模板知道它们的类型是什么”,这只适用于专门化。一般来说,如果您创建一个没有专门化的类型
my_type
,然后发送该代码,您永远都不知道T将是什么,因此无法为其编程。当然,你知道什么是专门化,这就是重点……你可以为它编程,而不必通过使用类型特征和类型条件等东西专门化类本身。不管怎么说,我想我们是站在同一个立场上的,投赞成票。“它不知道它是什么类型的”。什么意思?它完全知道它存储的类型。@Pubby:不,它不知道。它是一个模板类型,底层类型可以是任何类型,实际代码只在编译时生成。当
T
是指针类型时,它无法知道需要以不同的方式对待其内存存储,也无法以合理的方式这样做。它不可能知道给定指针引用的内存是如何分配的,因此它只能执行
delete[]\u my\u buffer通过简单的部分专门化,vector可能具有不同的销毁语义(例如,如果类型是指针,则调用
delete
)。模板知道它们的类型是什么。在vector的例子中,决定对所有类型使用相同的销毁语义(除了bool!),这就是为什么它是这样的。(很抱歉,如果这只是愚蠢的学究主义!)@Pubby:是的,所以它可以专门。。。但事实并非如此,所以我说的是真的。我想你说的是模板作为一种功能,而我说的是
std::vector
。然而