Трудно сказать, в чем ваша проблема, потому что отсутствует важная информация.
- Вы уверены, что произошел сбой при проверке, является ли
Data
нулевым указателем?
- Вы проверили, действительно ли
this
в момент сбоя?
- Поставили ли вы точку останова на конструктор, чтобы увидеть, когда он вызывается.
Хотя похоже, что вы не делаете никаких копий этих объектов, было бы неплохо предотвратить это, если это не поддерживается должным образом, путем удаления конструктора копирования и перемещения и операторов присваивания. См. https://en.cppreference.com/w/cpp/language/function#Deleted_functions для получения дополнительной информации.
Один очевидный способ проверить, заключается ли проблема в том, что вы вызываете функцию ExampleAppLog
до ее создания, - это поместить точку останова в конструктор. Исходя из приведенного выше кода, мы не можем быть уверены, что класс создается только один или несколько раз (из других мест).
Также вы уверены, что не вызываете Draw
или LookHook
до создания my_log2
объекта. Опять же, подобные вещи тривиальны для тестирования с помощью отладчика, но нам очень сложно сказать только часть кода в наших руках. На самом деле, так как вышеприведенная программа не имеет main
, это не MCVE.
Если он действительно дает сбой при создании объекта ExampleAppLog
, а не при попытке использовать его до того, как он был создан, то большая часть приведенного выше кода бесполезна и комментирует код (и удаляет его из вопроса), если он все еще крушение, очень помогло бы людям помочь вам.
С другой стороны, если происходит сбой из-за того, что вы используете my_log2 до того, как он будет создан, то отсутствует необходимый код для воспроизведения проблемы.
Если проблема связана с порядком инициализации, то решение может быть синглтоном. Посмотрите на принятый ответ здесь: Как реализовать многопоточный безопасный синглтон в C ++ 11 без использования .
В любом случае вам трудно помочь, потому что вы не уделяете достаточного внимания своему вопросу. Помните, что если код не может быть легко скопирован и вставлен, почти никто не будет тратить время на создание проекта еще больше, когда очевидно, что отсутствуют важные строки или информация, потому что с предоставленной информацией почти невозможно, чтобы он потерпел крах на указанная строка.
Фактически, мы предполагаем, что main - это пустая функция и что нет другого глобального использования ни my_log2
указателя, ни ExampleAppLog
struct, тогда когда будет вызвана функция reserve
.
В качестве бонуса, если вы зададите хорошие вопросы, вы получите больше очков на сайте!