Переместите эту строку:
CLandTypes::Pimple * CLandTypes::d = new CLandTypes::Pimple();
, чтобы быть после определения класса для CLandTypes::Pimple
.
Она возражает против вашей попытки использовать new
для создания экземпляра классаон ничего не знает.
Если вы сделаете это, удалите код, который проверяет, является ли d nullptr
(он же !d
) в вашем определении конструктора CLandTypes::CLandTypes
.Этот код может привести к утечке памяти.Кроме того, повторная проверка после вызова new
и последующего выброса ::std::bad_alloc
совершенно не нужна, поскольку new
определено для выброса ::std::bad_alloc
при ошибке выделения.
Способ возникновения утечки памятиесли конструктор запускается до запуска статического инициализатора, который инициализирует CLandTypes::d
.И это может произойти, только если конструктор для CLandTypes
используется в статическом инициализаторе где-то еще.Что произойдет, так это то, что конструктор даст значение d
, а затем статический инициализатор для d
запустится через некоторое время и перезапишет это значение, что приведет к утечке памяти.