我正在测试boost ptr_containers并编写了一个小程序,如下所示:
class Test {
public:
~Test() {
cout << "Test Destructor called" << endl;
}
};
int main(int argc, char** argv) {
boost::ptr_map<int, Test> TestContainer;
boost::ptr_vector<Test> TestVector;
for (int i=0; i<2; ++i) {
Test* ptr = new Test();
TestContainer.insert(i, ptr);
TestVector.push_back(ptr);
}
}
执行程序后,“Test Destructor called”打印四次,程序成功完成。我期待打印将发生2次然后“doube free ...”错误消息将被抛出。为什么在上面的情况下不会发生,但它是用原始指针(Test *)发生的?
答案 0 :(得分:1)
ptr_map
和ptr_vector
拥有自己的元素。
程序不正确。一次在两个容器中插入相同的元素会导致双重删除。
未删除已删除指针上的删除行为。任何事情都可能发生。请参阅 Undefined Behaviour
使用像valgrind这样的工具来捕获它。
如果您确实想知道,修复此示例的最简单方法是使用其中一个容器的非拥有指针。务必管理元素的相对生命周期:
#include <boost/ptr_container/ptr_vector.hpp>
#include <iostream>
#include <map>
class Test {
public:
~Test() {
std::cout << "Test Destructor called" << std::endl;
}
};
int main() {
boost::ptr_vector<Test> TestVector;
{
std::map<int, Test*> TestContainer;
for (int i=0; i<2; ++i) {
Test* ptr = new Test();
TestContainer.emplace(i, ptr);
TestVector.push_back(ptr);
}
}
}