我正在使用RTL作为动态库。这允许在全局命名空间中覆盖new / delete运算符,因为链接器将首先找到我的实现。我可以依赖malloc()和free()来完成分配,但有些东西比如'new_handlers'和'std :: nothrow'对象。标准库模板需要new / delete操作符的某种行为,但标准库在全局命名空间中的new / delete实现超出了范围!我可以使用标准库中的另一个命名空间中的实现吗?
我可以动态地确定标准库的强制执行的地址(在dll中)并通过指针调用它,但这不受美容奖励。这还有用吗? (我正在使用borland C ++ builder 2006)。
编辑我想问这个问题:此示例代码的行为是否类似于RTL的operator new(size_t)?还是我错过了解它?
void *new_replacement(size_t p_size)
{
void *l_retval = NULL;
while(l_retval == NULL && p_size != 0)
{
l_retval = malloc(p_size);
if (l_retval == NULL)
{
void (*l_handler)() = std::set_new_handler(NULL);
// could not find another way to obtain the current new_handler
if (l_handler == NULL) throw std::bad_alloc();
std::set_new_handler(l_handler);
l_handler();
}
}
return l_retval;
}