C++ 在全局命名空间中重写new/delete时,应该使用std rtl中new/delete的哪个默认实现?
我将RTL用作动态库。这允许在全局命名空间中使用重写的new/delete运算符,因为链接器将首先找到我的实现。我可以依靠malloc()和free()来完成分配工作,但也有像“new_handlers”和“std::nothrow”对象这样的东西。标准库模板需要new/delete操作符的某些行为,但是标准库在全局命名空间中实现new/delete超出了范围!在标准库的另一个命名空间中是否有我可以使用的实现 我可能会动态地确定标准库的实现地址(在dll中),并通过指针调用它,但这不受美观奖励的约束。这还能用吗?(我使用Borland C++ Builder 2006)。 编辑我想问这个问题: 此示例代码的行为是否类似于RTL的运算符new(size\t)?还是我误解了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中),并通过指针调用它,但这不受美观奖励的
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()
的用法。