gpt4 book ai didi

c++ - 为什么 boost ptr_container 在运行时不会发生双重释放或损坏错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:17:47 24 4
gpt4 key购买 nike

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

最佳答案

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

}

关于c++ - 为什么 boost ptr_container 在运行时不会发生双重释放或损坏错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com