C++ 地图分段错误(核心转储)
Posted
技术标签:
【中文标题】C++ 地图分段错误(核心转储)【英文标题】:C++ map segmentation fault (core dumped) 【发布时间】:2020-02-25 03:36:19 【问题描述】:我正在尝试使用 map
和 string
键,但它不起作用,我不知道为什么。
我想获得一些帮助,以了解有关使用这种如此重要的结构的 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
关键字 alloc
s 和 map
并取消引用它的返回点会将结构存储在 stock
Warehouse
成员属性中。
我理解错了吗?
【问题讨论】:
Map* _stock = new Map();
动态分配Map
和stock = *_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++ 地图分段错误(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章