簡體   English   中英

在歷史代碼中不尋常地使用新的。 這是什么意思?

[英]Unusual use of new in historical code. What does it mean?

我只是移植了一些舊代碼:

#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 newplacement new

但這現在是一個重載的新調用(帶有一些時髦的參數,一個五參數的new調用),或者這里是逗號運算符的逗號,因此它被縮減為("Help") (這沒有意義)。

new歷史(甚至現在)允許有兩個以上的參數, (size, hint)

任何解碼幫助將不勝感激。

您要查看的部分是§5.3.4/ 11-12,在此處解釋:

new-placement語法用於為分配函數提供其他參數。 如果使用,則對通過組合參數列表創建的函數調用執行重載解析,該參數列表包括請求的空間量(第一個參數)和new-expression的新放置部分中的表達式(第二個和后續參數) 。 第一個參數的類型為size_t,其余參數在new-placement中具有相應的表達式類型。

[例:
- new T導致操作員調用new(sizeof(T)),
- new(2,f)T導致操作員調用new(sizeof(T),2,f),
- 新T [5]導致操作員new的調用,和
- new(2,f)T [5]調用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*重載並將其作為分配結果返回。

我的假設是它是新的放置,並且所有5都是重載的參數。 在我的解釋中,其中一個參數是&hr ,它是一個錯誤代碼,然后用作operator,第二個參數operator,以提供作為結果值。

我不認為你對宏的使用是正確的,特別是我認為NEWPTR旨在成為實際初始化指針的地址,也就是說,調用代碼應該是:

hr = NewArrayOnHeap(double, 10, heap, &ptr, "Help");

這將擴大:

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

沒有額外的& ,內部賦值的左側和右側在類型上不匹配: *(ptr)double, while the result of placement new would be a double *`。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM