智能指针——程序终止时的分段错误
Smart Pointers - Segmentation Fault at Program Termination
我一直在做一个状态的东西来取代一些我一直在使用的糟糕得多的代码。我希望尽可能地现代化,所以我在适当的地方使用STL。我决定用unique_ptr
和shared_ptr
,这是我以前从未做过的。结果,我遇到了一个非常可怕的运行时错误:munmap_chunk(): invalid pointer: 0x00007fff7b3f08e0
我所知道的是错误与free()
和malloc()
有关,但我没有在我的代码中使用任何这些,所以我认为它来自STL内部。更奇怪的是,如果我在main开头放一个std::cout << "Hello World!n";
,我只得到一个Segmentation fault
。我的代码到目前为止相对较小:
state.hpp:
#pragma once
#include "state_manager.hpp"
class state{
using manager_ptr = std::shared_ptr<state_manager>;
protected:
manager_ptr man;
public:
const manager_ptr manager() const;
void manager(manager_ptr&& parent_manager);
};
state.cpp:
#include "state.hpp"
const state::manager_ptr state::manager() const{
return man;
}
void state::manager(manager_ptr&& parent_manager){
man = parent_manager;
}
state_manager.hpp:
#pragma once
#include <stack>
#include <memory>
class state;
class state_manager{
using element = std::unique_ptr<state>;
using container = std::stack<element>;
protected:
container states;
public:
void push(element&& to_push);
void pop();
void change(element&& change_to);
};
state_manager.cpp:
#include "state_manager.hpp"
#include "state.hpp"
void state_manager::push(element&& to_push){
states.push(std::forward<element>(to_push));
states.top()->manager(std::shared_ptr<state_manager>(this));
}
void state_manager::pop(){
states.pop();
}
void state_manager::change(element&& change_to){
states.pop();
push(std::forward<element>(change_to));
}
main.cpp:
#include "state_manager.hpp"
#include "state.hpp"
#include <iostream>
int main(int argc, const char* argv[]){
state_manager test;
test.push(std::make_unique<state>());
test.change(std::make_unique<state>());
test.pop();
}
这行代码中:
states.top()->manager(std::shared_ptr<state_manager>(this));
你正在构造一个指向this
的shared_ptr
。这意味着当shared_ptr的引用计数降为0时,它将delete
this
。这很糟糕,因为该类不是this
的所有者。在您的示例中,this
指针甚至没有由new
分配,因此shared_ptr将无法删除它。
你可以在state_manager
类中使用man
的普通c++指针,因为它目前不需要指针的所有权。
或者你需要一些其他的方式来获得shared_ptr
或weak_ptr
,指向this
,例如通过传递它到push
(这将是奇怪的)。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?