【发布时间】: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 关键字 allocs 和 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++ 时,最好忘记大部分内容。
标签: c++ dictionary c++11 pointers segmentation-fault