При компиляции с MINGW g cc перегруженный новый оператор не вызывается для std :: string - PullRequest
8 голосов
/ 13 января 2020

Эта программа (скомпилированная с опцией -std=c++17)

#include <stdio.h>
#include <string>
void* operator new(std::size_t nrOfBytes) {
    printf("allocate %zd bytes on heap\n", nrOfBytes);
    void* p = malloc(nrOfBytes);
    if (p) {
        return p;
    } else {
       throw std::bad_alloc{};
    }
}
int main() {
    // new operator is called when compiled with Clang or MSVS or GCC 
    int* i = new int;
    delete i;
    // new operator is not called when compiled with GCC
    // but is called with Clang and MSVS 
    std::string str(2000, 'x');
    return 0;
}

при компиляции с Clang или MSVS печатает:

выделяет 4 байта в куче

выделить 2016 байтов в куче

Однако при компиляции с G CC (версия 9.2.0 предоставлена ​​MSYS для Windows) он печатает только:

выделить 4 байта в куче

Мне известно об оптимизации коротких строк в GCC / libc ++, но не слишком ли много 2000 символов для короткой строки? Это вопрос единого входа вообще?

1 Ответ

4 голосов
/ 14 января 2020

Кажется, что G CC не реализует (или не может?) Корректно заменять глобальные operator new и operator delete, когда в Windows.

* 1004 задействованы динамические библиотеки c. * См. Отчеты об ошибках, например 77726 , 82122 и 81413 .

В вашем случае конструктор std::string и / или std::allocator<char>::allocate похоже, он находится в динамической библиотеке c стандартной библиотеки, так что используемый ею operator new не заменяется правильно.

...