Segfault при попытке вставить новую запись в переменную члена карты stl класса stati c - PullRequest
0 голосов
/ 16 июня 2020

Как сказано в заголовке, у меня возникла проблема при попытке вставить новое значение в карту, которая находится в классе stati c.

Этот класс stati c называется TaskCreator и его цель - быть фабрикой для задач. Внутри TaskCreator задачи сначала сохраняются на карте, затем при запуске программы на основе входных аргументов создается и выполняется правильная задача. Довольно прямолинейно. Каждый класс задачи (также stati c) наследует класс TaskCreator, поэтому класс и карта должны быть созданы по всем правилам до вызова REGISTER_TASK_TO_CREATOR.

task71. cpp :

REGISTER_TASK_TO_CREATOR(Task71, 7.1)
REGISTER_TASK_TO_EXECUTOR(Task71, 7.1)

std::shared_ptr<TaskCreator> Task71::create()
{
    return std::shared_ptr<TaskCreator>(new Task71());
}

taskcreator.h :

#define REGISTER_TASK_TO_CREATOR(className, taskName) \
    bool className::_creatorRegistered = \
    TaskCreator::registerTask(#taskName, className::create());
[...]
class TaskCreator
{
[...]
    static std::map<std::string, std::shared_ptr<TaskCreator>> _taskMap;
[...]
}

taskcreator. cpp:

std::map<std::string, std::shared_ptr<TaskCreator>> TaskCreator::_taskMap;
[...]
bool TaskCreator::registerTask(std::string taskName, std::shared_ptr<TaskCreator> createFunc)
{
    auto it = _taskMap.find(taskName);

    if (it == _taskMap.end()) {
        _taskMap[taskName] = createFunc; // -> point of failure
        return true;
    }
    return false;
}

Раньше это работало, но как только я сгруппировал исходные файлы и заголовки во вложенные папки, дела пошли под откос. Я использую Qt Creator 4.10.2 на Win 10, и я добавил следующие вещи в файл .pro:

SOURCES += \
    main.cpp \
[...]
    api/taskcreator.cpp \ # -> worked without api/ prefix, same for HEADERS
[...]
    tasks/task71.cpp      # -> worked without tasks/ prefix, same for HEADERS

HEADERS += \
[...]
    api/taskcreator.h \
[...]
    tasks/task71.h
[...]
INCLUDEPATH += \
    api \
    tasks

Теперь, когда я пытаюсь вернуть структуру подпапок, как это было раньше, я все еще получаю ошибки сегментации в том же месте.

ROOT ПРИЧИНА ОБНАРУЖЕНА

Неисправность не связана напрямую со структурой проекта, она произошла из-за инициализации stati c фиаско заказа , где регистрация задачи по макросу произошла до того, как stati c переменная _taskMap была инициализирована глобально. Изменение структуры файла продукта, вероятно, усугубило проблему с плохим кодом. как описано здесь .

...