C++ 在全局命名空间中重写new/delete时,应该使用std rtl中new/delete的哪个默认实现?

C++ 在全局命名空间中重写new/delete时,应该使用std rtl中new/delete的哪个默认实现?,c++,std,new-operator,overriding,C++,Std,New Operator,Overriding,我将RTL用作动态库。这允许在全局命名空间中使用重写的new/delete运算符,因为链接器将首先找到我的实现。我可以依靠malloc()和free()来完成分配工作,但也有像“new_handlers”和“std::nothrow”对象这样的东西。标准库模板需要new/delete操作符的某些行为,但是标准库在全局命名空间中实现new/delete超出了范围!在标准库的另一个命名空间中是否有我可以使用的实现 我可能会动态地确定标准库的实现地址(在dll中),并通过指针调用它,但这不受美观奖励的

我将RTL用作动态库。这允许在全局命名空间中使用重写的new/delete运算符,因为链接器将首先找到我的实现。我可以依靠malloc()和free()来完成分配工作,但也有像“new_handlers”和“std::nothrow”对象这样的东西。标准库模板需要new/delete操作符的某些行为,但是标准库在全局命名空间中实现new/delete超出了范围!在标准库的另一个命名空间中是否有我可以使用的实现

我可能会动态地确定标准库的实现地址(在dll中),并通过指针调用它,但这不受美观奖励的约束。这还能用吗?(我使用Borland C++ Builder 2006)。 编辑我想问这个问题:

此示例代码的行为是否类似于RTL的运算符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;
}

您拥有默认的实现,不再可以调用它。您必须重新实现它-例如,通过使用
malloc()
并考虑其返回值,这并不难。

然后is将使用该选项通过指针调用它。有太多的事情需要我自己去写。如果不难的话,你能给出一些代码示例如何像std rtl那样执行它吗?@bert jan:这个答案详细描述了它。我想新的\u处理程序函数负责抛出std::bad \u alloc对象,除非当前线程中有std::nothrow对象。这是真的吗?@bert jan:不,这个问题列出了
new\u handler()
的用法。