0

Visual Studio 2010 を使用している場合、次のステートメントに違いはありますか。

wchar_t *wszChar = new wchar_t;
delete wszChar;

wchar_t *wszChar = new wchar_t;
delete(wszChar);

デバッガーを調べたところ、同じことが行われているようです。

間はどうですか:

wchar_t *wszChar = new wchar_t[10];
delete[] wszChar;

wchar_t *wszChar = new wchar_t[10];
delete(wszChar);

私が見たところ、4つのケースすべてでメモリが正しく解放されました。

4

5 に答える 5

8

最初の 2 つは同等です。関数として何かを呼び出しているのではなく、式の一部の周りに冗長な括弧のセットを配置しているだけです.vs.または(あまりにも一般的な)1+2*3vs .とほぼ同等です.1+(2*3)return(23);return 23;

2 番目では、[]いつ括弧を追加したかを省略したため、未定義の動作が発生しました。

後者の典型的な (ただし確実に保証されているわけではありません) 結果は、メモリのブロック自体を解放しますが、配列内のアイテムのデストラクタの呼び出しに失敗します。あなたの場合(その配列にcharはデストラクタがありません)、それは検出できません。ただし、OS がプログラムの実行を停止するなど、他の副作用が発生する場合もあります。

例:

#include <iostream>

struct item {
    item() { std::cout << "create\n"; }
    ~item() { std::cout << "destroy\n"; }
};

int main() {
    std::cout << "test 1\n";
    item *items = new item[5];
    delete [] items;
    std::cout << "test 2\n";
    item *items2 = new item[5];
    delete items2;
}

結果:

test 1
create
create
create
create
create
destroy
destroy
destroy
destroy
destroy
test 2
create
create
create
create
create
destroy

...その後、OS によって実行が停止されます。

于 2013-10-02T17:59:56.763 に答える
1

delete(wszChar)関数を呼び出していません-式(wszChar)をオペランドとして持つ削除演算子です。

最後の例では、配列 new で作成されたポインターで配列以外の削除を呼び出すと、未定義の動作になります。特定の例で同じように機能するという事実 (つまり、明らかな問題がない) は、UB が明らかになる 1 つの方法です。の代わりに、実際の作業を行うデストラクタを持つオブジェクトを使用するように例を変更するwchar_tと、動作に違いが見られます。

于 2013-10-02T18:00:04.503 に答える
1

関数呼び出しのように見えますが、実際には通常のdelete演算子の後にprimary-expression (wszChar)が続きます。

delete wszChar;

2 番目の例では、使用する必要があるdelete場所を使用しているため、未定義の動作が発生します。delete[]

于 2013-10-02T18:00:10.847 に答える
1

変わりはない。使用()することは関数を呼び出すことを意味するのではなく、単に演算子()とを組み合わせることdeleteです:

delete (wszChar);

[]未定義の動作を避けるために使用することを忘れないでください。


明確にするために、キーワードを覚えておいてsizeofください。sizeof(int)またはを使用できますsizeof int

于 2013-10-02T18:00:48.817 に答える
1
delete(wszChar);

次と同等です。

delete wszChar;

このように組み合わせると、 for every aと for every a を呼び出す必要があるnewことを覚えておいてください。deletenew[]delete[]

wchar_t *wszChar = new wchar_t[10];
delete(wszChar);

動作は未定義です

于 2013-10-02T18:02:01.320 に答える