Ошибка сегментации карты C ++ (ядро сброшено) - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь использовать 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;
};

модель. 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, неправильно инициализировано.

Что именно происходит с инициализацией stock, выполняемой в конструкторе Warehouse? Я понимаю, что new ключевое слово alloc s map и разыменование его возвращаемой точки будет хранить структуру в атрибуте stock Warehouse member.

Я неправильно понял?

1 Ответ

1 голос
/ 25 февраля 2020

WAREHOUSE - это переменная static, определенная в заголовке. Это означает, что каждый исходный файл, содержащий этот заголовок, получает собственную копию этой переменной, инициализированную в nullptr. Только один исходный файл устанавливает свою собственную копию в ненулевое значение. Предположительно, какой-то другой исходный файл в не показанном коде пытается разыменовать его копию.

Make it

extern Warehouse* WAREHOUSE;
...