c++ - 智能指针 - 程序终止时的段错误

标签 c++ pointers stl unique shared

我一直在做一个 state-thingy 来替换我一直在使用的一些更糟糕的代码。我想尽可能现代,所以我在适当的地方使用 STL。我决定使用 unique_ptrshared_ptr ,这是我以前从未做过的。结果,我遇到了一个非常可怕的运行时错误:munmap_chunk(): invalid pointer: 0x00007fff7b3f08e0我所知道的是错误与 free() 有关和 malloc() ,但我没有在我的代码中使用任何这些,所以我假设它来自 STL 内部。更奇怪的是,如果我放一个 std::cout << "Hello World!\n";在 main 的开头,我只得到一个 Segmentation fault到目前为止,我的代码相对较小:

状态.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);
};

状态.cpp:

#include "state.hpp"

const state::manager_ptr state::manager() const{
 return man;
}

void state::manager(manager_ptr&& parent_manager){
 man = parent_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);
};

状态管理器.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));
}

主要.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));

您正在构造一个指向thisshared_ptr。这意味着当 shared_ptr 的引用计数降为零时,它将delete this。这很糟糕,因为该类不是 this 的所有者。在你的例子中,this 指针甚至没有被 new 分配,所以 shared_ptr 将无法删除它。

您可以在 state_manager 类中为 man 使用普通的 C++ 指针,因为它目前不需要指针的所有权。

或者,您需要一些其他方法来获取指向 thisshared_ptrweak_ptr,例如通过将其传递给 push(这很奇怪)。

关于c++ - 智能指针 - 程序终止时的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32939910/

相关文章:

c++ - 可视化源

c++ - g++-4.8 C++ stdlib 动态库

c - 需要 C 程序帮助

c - 打印垃圾值,c

c++ - set_difference、set_intersection 和 set_union 的就地版本

c++ - C++ 容器上的通用操作

c++ - g++ 编译器优化

c++ - 是否有跨平台方法可以将资源嵌入到用 C++ 编写的二进制应用程序中?

c++ - 如何在指针中返回指针中的指针

使用 STL 容器和 typedef 的 C++ 模板类