在覆盖全局命名空间中的new / delete时,我应该使用什么默认的std-rtl中的new / delete实现?

时间:2011-07-15 12:30:14

标签: c++ std new-operator override

我正在使用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;
}

1 个答案:

答案 0 :(得分:2)

replaced, not overridden是默认实现,您无法再调用它。你将不得不重新实现它 - 例如使用malloc()并处理它的返回值,这不是很难。