Ответ 1
Глядя на вывод g++ ... -S
с/без -fwhole-program
, кажется, что все пользовательские операторы new/delete вообще не выбрасываются при использовании fwhole-program
.
Я начинаю подозревать, что мы смотрим на ошибку здесь.
Обновление: Следующая проблема зависит от параметра -fwhole-program
.
Я немного поиграл с распределением памяти, и я столкнулся с небольшой загадкой: в GCC (4.6), как std::string
выделяет свою память [edit] при компиляции с помощью -fwhole-program
[/]?
Выполните следующую тестовую программу:
#include <new>
#include <string>
#include <iostream>
#include <cstdlib>
void * operator new(std::size_t n) throw(std::bad_alloc)
{
void * const p = std::malloc(n);
if (p == NULL) throw std::bad_alloc();
std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n";
return p;
}
void operator delete(void * p) noexcept
{
std::cerr << "delete() at " << p << ".\n";
std::free(p);
}
int main()
{
std::string s = "Hello world.";
}
Когда я использую любой другой динамический контейнер (который использует std::allocator<T>
), распределитель использует ::operator new
, и поэтому я хорошо вижу отладочные сообщения. Однако, с std::string
, я ничего не вижу. Я уверен, что динамическое распределение происходит, хотя, как я могу подтвердить valgrind (выделено 13 плюс длина строки байтов). Я просмотрел несколько исходных файлов и стандарт, и я уверен, что шаблон std::basic_string<T, std::char_traits<T>, std::allocator<T>>
, поэтому я не понимаю, почему я не вижу сообщения из моих замененных функций выделения.
Может ли кто-нибудь пролить свет на эту головоломку? Что мне нужно для отслеживания распределения строк? Кроме того, может ли кто-нибудь запустить это через какой-то другой компилятор и посмотреть, не производит ли он какой-либо вывод?
(Например: если я добавляю std::map<int, int> m { { 0, 1 } };
, у меня есть вывод new() requests 24 bytes, allocated at 0x8d53028
и т.д.)
Глядя на вывод g++ ... -S
с/без -fwhole-program
, кажется, что все пользовательские операторы new/delete вообще не выбрасываются при использовании fwhole-program
.
Я начинаю подозревать, что мы смотрим на ошибку здесь.