为什么在运行时没有为boost ptr_container发生双重释放或损坏错误?

时间:2015-06-19 19:22:39

标签: c++ memory-management boost

我正在测试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 *)发生的?

1 个答案:

答案 0 :(得分:1)

ptr_mapptr_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);
        }
    }

}
相关问题