我在努力用XCode 3.2,GCC 4.2,libstdC++ 4.0,動態版本替換全局新增和刪除操作符。在OSX上替換libstdC++。dylib(4.0)全局新增和刪除操作符
我直接從標頭「新」採取原型,並實施它們。它們粘貼在下面。
該項目是一個.plugin所以動態庫。這個插件必須將分配委託給主應用程序自己的alloc/free例程,這些例程位於舊的C SDK中。
所有我自己對新/刪除以及std :: list和std :: map分配的調用都被正確地替換了,但是當std :: vector :: push_back不得不增加它的緩衝區時。這種情況下,我的運營商新不叫,但我的運營商刪除是。我知道,因爲我在我的新運算符分配的任何緩衝區的前四個字節中寫入了一個令牌,並且我在運算符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();
}
下面的代碼會導致斷言時,「喲」超出範圍,因爲分配給的std ::矢量內存不是由我的運營商新的分配。
{
std::vector<std::string> yo;
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
yo.push_back("yoyoma");
}
下面的代碼是可以的,因爲的std ::矢量::儲備調用我的operator 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 ::矢量:: push_back實現時需要增長緩衝區(該方法名爲_M_insert_aux)。我所知道的是,我的操作符new從來不會從std :: vector :: push_back中調用。
上述解決方法不能應用於我正在使用的所有第三方庫。其中之一是push_back的大用戶。
我試着靜態鏈接到libstdC++。a但我遇到同樣的問題。
是否有一些std :: vector < std :: string>不使用全局new運算符的特化?
順便說一句,這與VS9的Windows完美工作。
更可靠的方法來檢查您是否被調用是在調用應用程序API之前插入斷點。 – Potatoswatter 2010-08-12 21:29:40