人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Visual C++ 6.0 にて
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とする必要があるのでしょうか?



●質問者: TONTON3
●カテゴリ:コンピュータ
✍キーワード:C++ Char DELETE
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● きゃづみぃ
●0ポイント

http://wisdom.sakura.ne.jp/programming/c/c17.html

文字列

C言語では 文字列は ヌルで終わる決まりになっています。

ヌルというのは 0 です。

なので1文字分、余計に宣言しないとダメなのです。

◎質問者からの返答

それは解りますが NULL を入れないとdelete できないのが何故なのか理解できないんです。


2 ● EddyYamanaka
●20ポイント

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 をすれば問題ないのですが


3 ● EddyYamanaka
●0ポイント

http://www.hatena.ne.jp/

はてな

『*pszTmp = ’A’;』を試してみましたが、こちらはエラーになりませんけど?

◎質問者からの返答

いや、なりますよー だめです。

VC6.0 がへぼいのかな

LPSTR pszTmp = (LPSTR ) new char [ 1];

*pszTmp = ’A’;

delete[] pszTmp;

ですよ?


4 ● aki73ix
●50ポイント

http://www.it-engineer.jp/main/programing/sample/vc3.html

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さんのおっしゃるとおりと思います。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ