将auto_ptr拥有的指针存储在导致崩溃的向量中
Storing pointers owned by auto_ptr's in a vector causing a crash
我在使用auto_ptr时遇到崩溃困难。 我知道您不能将auto_ptr存储在 STL 容器中。 但是,如何将auto_ptr持有的指针值存储在矢量中呢? 如果auto_ptr删除了它们指向的存储对象,则存储这些内部指针的向量随后的破坏会导致我的程序在 vectors Tidy_ 方法中崩溃。
ClassA {
public:
ClassA() {
auto_pointer_1_.reset(new ClassP());
auto_pointer_2_.reset(new ClassP());
auto_pointer_3_.reset(new ClassP());
};
std::auto_ptr<ClassP> auto_pointer_1_;
std::auto_ptr<ClassP> auto_pointer_2_;
std::auto_ptr<ClassP> auto_pointer_3_;
};
ClassB {
public:
ClassB(ClassA& a_class_a_) {
vector_of_pointers_.push_back(a_class_a_.auto_pointer_1_.get());
vector_of_pointers_.push_back(a_class_a_.auto_pointer_2_.get());
vector_of_pointers_.push_back(a_class_a_.auto_pointer_3_.get());
};
std::vector<ClassP*> vector_of_pointers_;
};
void main(void) {
ClassA* class_a_variable_ = new ClassA();
ClassB* class_b_variable_ = new ClassB(*class_a_variable_);
delete class_a_variable_;
delete class_b_variable_; <--- CRASH in std::vector Tidy_ method
}
谁能向我解释为什么会发生崩溃? 当auto_ptr删除其存储的指针时,矢量中的关联指针不再指向任何内容,但为什么这会阻止矢量正确破坏?
谢谢
如图所示,当添加不执行任何操作的存根ClassP
时,程序没有问题(并且在需要时添加class
,并且main()
更改为返回int
)。您观察到的行为可能是由于内存损坏。
如果ClassA
、ClassB
或ClassP
中的任何一个或全部实际上具有非平凡的析构函数,则可能至少有一个析构函数实现存在导致未定义行为的错误。你应该把注意力集中在这一点上。
意识到std::auto_ptr
已被弃用,你应该改用std::unique_ptr
,正如Ben Voigt所指出的那样。
相关文章:
- 智能指针的排序向量:神秘崩溃
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 当我尝试将一个向量元素的值分配给另一个向量元素时,为什么我的应用程序会崩溃
- C++线程的向量在连接时随机崩溃
- C++ 尝试向类内的数组(或向量)添加值时程序崩溃
- 试图删除最后一个std ::向量元素时,程序会崩溃
- 当通过结构中的指针引用COM_PTR的向量时,向量大小未知时崩溃
- 返回向量<对<字符串,字符串>>会导致 gcc 编译代码 (curlcpp) 崩溃
- 程序崩溃,说向量不超出范围异常
- 崩溃,如果使用向量删除了一个嵌入式容器的destructor中删除char*成员
- C++崩溃:push_back嵌套向量
- 计算向量::empty()正在使程序崩溃
- 在RELEASE配置中使用向量push_back时,C++代码崩溃
- c++迭代程序在向量上迭代时崩溃
- 自定义分配器有时会与stl向量一起崩溃
- 每当我输入长度为4的字符串时,下面的cpp代码就会崩溃(向量中的malloc失败)
- 处理大向量会使程序崩溃并带有bad_alloc
- 传递一个向量作为参数并使用它,它为什么会崩溃
- C++向量迭代器:erase() 最后一个项目崩溃
- 当 C 中的对象向量中有太多lua_state时,lua_close() 崩溃