LPSTR pszTmp = (LPSTR ) new char [ 1];
strcpy(pszTmp,”A”);
delete[] pszTmp;
とすると
CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize
でアサートとなります。
LPSTR pszTmp = (LPSTR ) new char [ 2];
とすると正常にdeleteが走りますが。
何故文字数+1とする必要があるのでしょうか?
C言語では 文字列は ヌルで終わる決まりになっています。
ヌルというのは 0 です。
なので1文字分、余計に宣言しないとダメなのです。
http://www.hatena.ne.jp/1111120904
人力検索はてな - Visual C++ 6.0 にて LPSTR pszTmp = (LPSTR ) new char [ 1]; strcpy(pszTmp,”A”); delete[] pszTmp; とすると CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMans..
strcpy()にて確保したデータエリアを越えた場所にターミネータを書き込んだため、new/deleteで使用する管理エリアを破壊したのでしょう。
ただ単に
*pszTmp =’A’;
としても同じくアサートです。
どうしてなんだろ
としただけでもアサートになります。
この場合も +1 をすれば問題ないのですが
『*pszTmp = ’A’;』を試してみましたが、こちらはエラーになりませんけど?
いや、なりますよー だめです。
VC6.0 がへぼいのかな
LPSTR pszTmp = (LPSTR ) new char [ 1];
*pszTmp = ’A’;
delete[] pszTmp;
ですよ?
strcpy(pszTmp,”A”)の場合は
”A¥000”の2バイトがpszTmpに上書きされるので、問題が発生します
memcpy(pszTmp,”A”,1)の場合は問題ないはずなので、普通は
LPSTR pszTmp = (LPSTR ) new char [ 1];
*pszTmp = ’A’;
delete[] pszTmp;
でもエラーになりませんね
理由は、変数領域には干渉しないからです
これでエラーが出る理由ですが、デバッガによっては LPSTRは文字列型変数なのでチェック時にNULLが含まれていないとASSERTを返すものがあるようです
だから・・・
strcpy(pszTmp,”¥000”);や
*pszTmp=”¥000”;
とした場合は発生しませんよね
でも、本来LPSTR は CHAR*と定義されてるのでメモリ領域の char と考えればエラーは起こらないような気も・・・
char *pszTmp=new char[1];
unsigned char *pszTmp=new unsigned char[1];
などと定義した場合は、また結果が変わってくるかもしれませんね
すいません、もう一回やってみたらエラーになりませんでした。
はい、aki73ixさんのおっしゃるとおりと思います。ありがとうございました。
それは解りますが NULL を入れないとdelete できないのが何故なのか理解できないんです。