gpt4 book ai didi

c++ - 历史代码中异常使用 new。这是什么意思?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:50 26 4
gpt4 key购买 nike

我只是移植了一些旧代码:

#define NewArrayOnHeap(TYPE, COUNT, HEAP, NEWPTR, ERROR) \
((*(NEWPTR) = new ( #TYPE "[" #COUNT "]", __alignof(TYPE), (HEAP), &hr, (ERROR)) TYPE[COUNT] ), hr)

看起来原来应该定义他们自己的神奇 new 运算符。我很好奇这种用法。

示例用法

int main()
{
void* heap = /* Don't know how to define this */
double* ptr;
HRESULT hr;

hr = NewArrayOnHeap(double, 10, heap, ptr, "Help /* Just guessing here */");
}

当我使用 g++ -E 获取预处理器输出时,它是:

int main()
{
double* ptr;
HRESULT hr;

hr = ((*(ptr) = new ( "double[ 10 ]", __alignof(double), (NULL), &hr, ("Help")) double[10] ), hr);
}

这看起来更像是一个placement new

但这现在是一个重载的 new 调用(带有一些奇怪的参数,一个五参数 new 调用),还是这里的逗号是逗号运算符,因此它被简化为 ("帮助”)(这没有意义)。

new 在历史上(甚至现在)是否允许有两个以上的参数,(size, hint)

如有任何解码方面的帮助,我们将不胜感激。

最佳答案

您要查看的部分是 §5.3.4/11-12,此处解释如下:

The new-placement syntax is used to supply additional arguments to an allocation function. If used, overload resolution is performed on a function call created by assembling an argument list consisting of the amount of space requested (the first argument) and the expressions in the new-placement part of the new-expression (the second and succeeding arguments). The first of these arguments has type size_t and the remaining arguments have the corresponding types of the expressions in the new-placement.

[Example:
— new T results in a call of operator new(sizeof(T)),
— new(2,f) T results in a call of operator new(sizeof(T),2,f),
— new T[5] results in a call of operator new, and
— new(2,f) T[5] results in a call of operator new[](sizeof(T)*5+y,2,f).]

因此,要正确使用您的宏,需要某处有一个 operator new。重载定义类似于:

void* operator new[](size_t, const char*, size_t, void*, HRESULT*, const char*);

我怀疑它使用提供给它的信息来分配满足对齐要求的内存(可能来自预分配源),同时记录此分配并在无法进行分配时提供自定义错误消息。

就我个人而言,我觉得这很恶心。 :)


您所指的典型“placement new”运算符在 <new> 中定义, 并且只是另一个接受 void* 的重载并将其作为分配结果返回。

关于c++ - 历史代码中异常使用 new。这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4684719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com