std::vector<Object *> pVector;
当超出范围时,指针数组/向量是否可以自动删除每个指针元素?还是必须手动删除每个对象?
那么我是否可以这样认为:如果向量/数组存储无指针元素,它会自动调用解构函数?但是如果存储了指针,它应该手动删除元素吗?
vector
正确销毁存储在向量中的对象。将调用析构函数。如果您有一个指针向量,那么这意味着指针自己的析构函数(而不是它指向的析构函数)。
原始指针的析构函数什么都不做。如果您有一个指向程序另一部分将破坏的对象的非拥有指针,这就是您想要的。
智能指针的析构函数会做任何必要的事情来确保对象在正确的时间被释放。对于unique_ptr
,就是现在。对于shared_ptr
,它是每当引用计数达到零时。
当元素被擦除时,使用正确类型的指针和信任向量来触发与该指针相关的行为。
不,它vector
只会删除它所拥有的内存,这是保存指针的内存 - 实际上,它将是一个一定大小的数组,例如:
Object **array = new Object*[size];
当调用析构函数时,所有被删除的是这个数组存储:
delete[] array;
正如你所看到的,这不会释放那些指针指向的任何东西。这就是为什么您应该使用 a vector
ofunique_ptr
或shared_ptr
与原始指针相对的原因。
当 std::vector 被销毁时,它Object *
不会调用析构函数,Object
因此只有指向内存的指针被销毁。
您应该使用智能指针(std::shared_ptr<Object> or std::unique_ptr<Object>)
,boost::ptr_vector<Object>
它们都将为您管理内存。