C++ 地图分段错误(核心转储)

Posted

技术标签:

【中文标题】C++ 地图分段错误(核心转储)【英文标题】:C++ map segmentation fault (core dumped) 【发布时间】:2020-02-25 03:36:19 【问题描述】:

我正在尝试使用 mapstring 键,但它不起作用,我不知道为什么。 我想获得一些帮助,以了解有关使用这种如此重要的结构的 C++ 基础知识。

model.hpp

#pragma once
#include <map>
#include <utility>
#include <string>
#include <iostream>
#include "../prs/ast.h"

using namespace std;
using namespace ast;

typedef map<string, Variable> Map;
typedef pair<string, Variable> Element;

namespace model

    class Warehouse 
    public:
        Map stock;

        Warehouse()
            Map* _stock = new Map();
            stock = *_stock;
        

        Variable* get(string id)
            Map::iterator it = stock.find(id);
            if (it != stock.end())
                return &(*it).second;
            
            else 
                return __define__(id);
            
        

        Variable* __define__(string id)
            Variable* defined = new Variable(id);
            stock.insert(Element(id, *defined));
            return defined;
        
    ;

    static Warehouse* WAREHOUSE;
;

model.cpp

#pragma once
#include "model.hpp"

using namespace std;

namespace model 
    Warehouse* WAREHOUSE = new Warehouse();

在此上下文中,Variable 是在ast 中定义的项目对象 命名空间已经过测试,WAREHOUSE 指针也在相应地工作,与类 初始化

指令stock.find(id) 正在抛出上述错误消息:Segmentation fault (core dumped),我想这意味着stock 的初始化不正确。

Warehouse 构造函数中完成的stock 初始化到底发生了什么? 我知道 new 关键字 allocs 和 map 并取消引用它的返回点会将结构存储在 stock Warehouse 成员属性中。

我理解错了吗?

【问题讨论】:

Map* _stock = new Map(); 动态分配Mapstock = *_stock; 取消引用指针以将Map副本分配给成员变量。当构造函数结束时,指针超出范围并且最初分配的内存被泄漏。我不知道你为什么在这段代码中使用new 和原始指针。您的段错误可能与手动内存管理有关(内存泄漏、双重删除、释放后使用等)。 这段代码中有一大堆nonos。 1. using namespace 永远不应该在头文件中使用,using namespace std 永远不要在句号中使用。 2. 双下划线是禁止使用的。 3.new是过去千年关键字,使用智能指针。但是无论如何,std::map 几乎不应该被分配到免费商店。 4. 一切都是公开的,为什么? 5、x = *new X形式的内存泄漏。您是否有 Java 背景?编写 C++ 时,最好忘记大部分内容。 【参考方案1】:

WAREHOUSE 是在标头中定义的static 变量。这意味着每个包含该标头的源文件都会获得该变量的自己的副本,初始化为nullptr。只有一个源文件将其自己的副本设置为非空值。据推测,代码中未显示的其他一些源文件试图取消引用其副本。

做起来

extern Warehouse* WAREHOUSE;

【讨论】:

以上是关于C++ 地图分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

运行我的代码时出现分段错误(核心转储)问题

C++ 的核心转储分段错误

C++ 代码的分段错误(核心转储)

c++:分段错误(核心转储)

C++ std 线程和列表分段错误(核心转储)

分段错误(核心转储) - 无法访问的计数器值