为什么 vector 在清除时不调用指针的析构函数?
Why vector does not call destructor of pointers on clearing?
考虑以下两个例子
Example A:
foo a;
std::vector<foo> vec;
vec.push_back(a);
vec.clear(); //Destructor of a is called;
Example B:
foo *b = new foo();
std::vector<foo*> vec;
vec.push_back(b);
vec.clear(); //Destructor of b is not called;
我想知道为什么清除向量时调用向量中对象的析构函数,为什么清除向量时不调用指针的析构函数。
b
的析构函数(如果可以这样称呼)被调用。 b
是一个指针,它将像任何其他超出范围的对象一样被销毁。
但是,就像所有其他 pointer 一样,b
超出范围不会破坏它指向的东西。那将是极其危险和令人困惑的。这是经过深思熟虑的:使用指针和间接寻址的主要目的之一就是防止。
如果您使用 C++11 或更高版本,您可以通过切换到 "smart pointer" 实现来获得此行为,这会达到您的预期;通过拥有指针并确保没有其他任何东西,当指针本身超出范围时销毁指针是安全的:
std::unique_ptr<foo> b = std::make_unique<foo>();
std::vector<std::unique_ptr<foo>> vec;
vec.push_back(b);
vec.clear();
或者,更好:
std::vector<std::unique_ptr<foo>> vec;
vec.emplace_back(new foo);
vec.clear();
在 C++03 中,您必须遍历向量并在清除它之前对其所有指针调用 delete
。
容器只拥有它们直接包含的元素——在本例中是指针。他们不拥有这些指针的指针,因此没有义务(甚至不允许)销毁它们。
您可以使用 vector
个 unique_ptr
:
std::vector<std::unique_ptr<foo>> vec;
vec.emplace_back( new foo );
unique_ptr
s 拥有它们的指针,因此包含并拥有 unique_ptr
s 的 vector
随后也拥有它们的指针,并且会在销毁元素时隐式销毁它们(例如,当超出范围时)。
也看看 Boosts Pointer Container Library,特别是 boost::ptr_vector
。
boost::ptr_vector<foo> vec;
vec.push_back( new foo );
// the object is automatically destroyed
考虑以下两个例子
Example A:
foo a;
std::vector<foo> vec;
vec.push_back(a);
vec.clear(); //Destructor of a is called;
Example B:
foo *b = new foo();
std::vector<foo*> vec;
vec.push_back(b);
vec.clear(); //Destructor of b is not called;
我想知道为什么清除向量时调用向量中对象的析构函数,为什么清除向量时不调用指针的析构函数。
b
的析构函数(如果可以这样称呼)被调用。 b
是一个指针,它将像任何其他超出范围的对象一样被销毁。
但是,就像所有其他 pointer 一样,b
超出范围不会破坏它指向的东西。那将是极其危险和令人困惑的。这是经过深思熟虑的:使用指针和间接寻址的主要目的之一就是防止。
如果您使用 C++11 或更高版本,您可以通过切换到 "smart pointer" 实现来获得此行为,这会达到您的预期;通过拥有指针并确保没有其他任何东西,当指针本身超出范围时销毁指针是安全的:
std::unique_ptr<foo> b = std::make_unique<foo>();
std::vector<std::unique_ptr<foo>> vec;
vec.push_back(b);
vec.clear();
或者,更好:
std::vector<std::unique_ptr<foo>> vec;
vec.emplace_back(new foo);
vec.clear();
在 C++03 中,您必须遍历向量并在清除它之前对其所有指针调用 delete
。
容器只拥有它们直接包含的元素——在本例中是指针。他们不拥有这些指针的指针,因此没有义务(甚至不允许)销毁它们。
您可以使用 vector
个 unique_ptr
:
std::vector<std::unique_ptr<foo>> vec;
vec.emplace_back( new foo );
unique_ptr
s 拥有它们的指针,因此包含并拥有 unique_ptr
s 的 vector
随后也拥有它们的指针,并且会在销毁元素时隐式销毁它们(例如,当超出范围时)。
也看看 Boosts Pointer Container Library,特别是 boost::ptr_vector
。
boost::ptr_vector<foo> vec;
vec.push_back( new foo );
// the object is automatically destroyed