TCHARのnewとdelete

解決


ぴょぴょ  2014-04-25 01:05:55  No: 73882  IP: [192.*.*.*]

タイトル通りでTCHARのnewとdeleteについて素朴な疑問です。
(C++は数年前に入門したばかり)

まずDWORD型は
LPDWORD a = new DWORD;
LPDWORD b = new DWORD[100];
でメモリを確保して
delete a;
delete[] b;
ですよね。

ではTCHAR型は
LPTSTR c = new TCHAR;
LPTSTR d = new TCHAR[100];
でメモリを確保して
delete c;
delete[] d;
となるのでしょうか?

つまり「d」を「delete d;」としてはいけないのか?
今までコンパイル・エラーがなかったので疑問に思わなかった。
しかし、まずいプログラミングをして来たのかな〜と。

どちらが正しいのかC++に詳しい方にお聞きしたいです。
よろしくお願いします。

編集    削除
YuO  2014-04-25 02:52:15  No: 73883  IP: [192.*.*.*]

シ 785 ]

LPTSTR = TCHAR *です。
なので,delete [] d;としないといけません。

配列オブジェクトをdeleteした場合は未定義の振る舞いなので,
コンパイラがコンパイルエラーにする必要はありません。
なので,自分で注意する必要があります。

なお,LPTSTRはナル文字終端文字列なので,
LPTSTR c = new TCHAR;
は通常あり得ません。
cが0以外に設定できなくなるためです。
# 設定してもよいが,型の意味とずれるのでバグの元になる。

編集    削除
ぴょぴょ  2014-04-25 10:21:31  No: 73884  IP: [192.*.*.*]

> LPTSTR = TCHAR *です。
> なので,delete [] d;としないといけません。
やはり、そうなりますね。

> 配列オブジェクトをdeleteした場合は未定義の振る舞いなので,
> コンパイラがコンパイルエラーにする必要はありません。
未定義でしたか。

YuOさん。
ありがとうございました。

編集    削除