Я стараюсь заменить глобальные операторы new и delete на XCode 3.2, GCC 4.2, libstdc ++ 4.0, динамическую версию.
Я взял прототипы прямо из заголовка «new» и реализовал их.Они наклеены ниже.
Проект является .plugin, поэтому динамическая библиотека.Этот плагин ДОЛЖЕН делегировать распределение собственным процедурам alloc / free основного приложения, которые находятся в старом C SDK.
Все мои собственные вызовы new / delete вместе с распределениями std :: list и std :: map корректно заменены, НО только когда std :: vector :: push_back должен увеличить свой буфер.В этом случае мой оператор new не вызывается, а оператор удаления -.Я знаю это, потому что я записываю токен в первые четыре байта любого буфера, выделенного моим новым оператором, и проверяю этот токен в операторе delete.Ниже приведен код ошибки.
extern "C++"
{
__attribute__((visibility("default"))) void* operator new(std::size_t) throw (std::bad_alloc);
__attribute__((visibility("default"))) void* operator new[](std::size_t) throw (std::bad_alloc);
__attribute__((visibility("default"))) void operator delete(void*) throw();
__attribute__((visibility("default"))) void operator delete[](void*) throw();
__attribute__((visibility("default"))) void* operator new(std::size_t, const std::nothrow_t&) throw();
__attribute__((visibility("default"))) void* operator new[](std::size_t, const std::nothrow_t&) throw();
__attribute__((visibility("default"))) void operator delete(void*, const std::nothrow_t&) throw();
__attribute__((visibility("default"))) void operator delete[](void*, const std::nothrow_t&) throw();
}
Следующий код вызовет утверждение, когда "yo" выходит из области видимости, поскольку память, выделенная для std :: vector, не была выделена моим оператором new.
{
std::vector<std::string> yo;
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
}
Следующий код в порядке, потому что std :: vector :: reserve вызывает мой оператор new:
{
std::vector<std::string> yo;
yo.reserve(4);
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
}
GBD (отладчик) не позволит встретиться шагу с std :: vectorРеализация :: push_back, когда необходимо увеличить буфер (метод называется _M_insert_aux).Все, что я знаю, это то, что мой оператор new никогда не вызывается из std :: vector :: push_back.
Обходное решение не может быть применено ко всем сторонним библиотекам, которые я использую.Один из них - большой пользователь push_back.
Я пытался статически связываться с libstdc ++. A, но у меня та же проблема.
Есть ли какая-то специализация для std :: vector , в которой не используется глобальный оператор new?
Кстати, это отлично работает на окнах с VS9.