5

私はいくつかの古いコードを移植しています:

#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.

しかし、これはオーバーロードされた新しい呼び出し (いくつかのファンキーなパラメーター、5 つのパラメーターnew呼び出し) ですか、それともここのコンマはコンマ演算子であり、したがって("Help")(意味がありません) に縮小されます。

new歴史的に (または現在でも) 3 つ以上のパラメーターを持つことが許可されていました(size, hint)

デコードに関するヘルプをいただければ幸いです。

4

2 に答える 2

7

あなたが見たいセクションは、§5.3.4/11-12 です。

new-placement 構文は、割り当て関数に追加の引数を提供するために使用されます。使用された場合、オーバーロードの解決は、要求されたスペースの量 (最初の引数) と new-expression の new-placement 部分の式 (2 番目以降の引数) で構成される引数リストを組み立てることによって作成された関数呼び出しで実行されます。 . これらの引数の最初の型は size_t で、残りの引数は new-placement の対応する型の式を持ちます。

[例:
— new T は演算子 new(sizeof(T)) の呼び出しになります,
— new(2,f) T は演算子 new(sizeof(T),2,f) の呼び出しになります,
— new T[ 5] は演算子 new の呼び出しになり、
— new(2,f) T[5] は演算子 new[](sizeof(T)*5+y,2,f) の呼び出しになります。

したがって、マクロを正しく使用するには、次のoperator newように定義されたオーバーロードがどこかにある必要があります。

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

与えられた情報を使用して、アラインメント要件を満たすメモリを (潜在的に事前に割り当てられたソースから) 割り当て、この割り当てをログに記録し、割り当てができなかった場合はカスタム エラー メッセージを提供すると思われます。

個人的に、私はそれがひどいと思います。:)


あなたが参照している典型的な「新しい配置」演算子は で定義されており、 a を受け入れてそれを割り当て結果として返す<new>単なる別のオーバーロードです。void*

于 2011-01-13T20:24:37.090 に答える
3

私の仮定では、それは新しい配置であり、5 つすべてがオーバーロードへの引数であるということです。私の解釈では、引数の 1 つは です&hr。これはエラー コードであり、2 番目の引数として使用され、それoperator,を結果値として提供します。

マクロの使用法が正しいとは思いません。特に、NEWPTR初期化する実際のポインターのアドレスになることを意図していると思います。つまり、呼び出しコードは次のようにする必要があります。

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

これは展開を行います:

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

extra&がないと、内側の代入の左右の型が一致しません: *(ptr)is a double, while the result of placement new would be adouble*`.

于 2011-01-13T20:31:00.657 に答える