Конструктор не вызывается с / NODEFAULTLIB - PullRequest
0 голосов
/ 24 мая 2019

Я использую / NODEFAULTLIB для отключения CRT (C Runtime), однако мой конструктор не вызывается, что приводит к ошибке в std :: map (нарушение прав доступа), поскольку он не инициализирован должным образом, так как std ::конструктор карты не вызывается.

Код, скомпилированный с LLVM 8.0.0, скомпилированный в режиме отладки x86

class c_test
{
public:

    c_test( int a ) // Constructor not called
    {
        printf( "Test: %i\n", a ); // Doesn't appear and breakpoint is not reached
    }

    void add( const std::string& key, const std::string& val )
    {
        _data[ key ] = val;
    }

private:
    std::map< std::string, std::string >                        _data;
};

c_test test{ 1337 };

int main()
{
    test.add( "qwrqrqr", "23142421" );
    test.add( "awrqw", "12asa1faf" );

    return 1;
}

Я реализовал свои собственные функции new (HeapAlloc), delete (HeapFree), printf, memcpy, memmove и т. д., и все работает отлично, я понятия не имею, почему это происходит.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Отключение CRT - это безумие.

Это выполняет важные функции, такие как статическая инициализация.Отсутствие статической инициализации является причиной того, что ваша карта находится в поврежденном состоянии.Я также ожидал бы, что различные части стандартной библиотеки просто перестанут работать;вы действительно создаете огромную проблему для себя.

Не изобретайте маленькие кусочки критического оборудования - включите CRT и используйте код, написанный экспертами.Отключить его на самом деле нельзя с точки зрения относительной ценности.

0 голосов
/ 27 мая 2019

Я обнаружил проблему и решил, один парень с другого форума сказал, что мне нужно вручную вызывать конструкторы, которые хранятся в указателях в разделе .CRT, я просто сделал это, и это прекрасно работало

enter image description here

enter image description here

enter image description here

Я только что вызвал функцию _GLOBAL__sub_I_main_cpp, которая вызывает мой конструктори решил все мои проблемы, спасибо за ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...