2011-09-12 19 views
2

次のコードがありますが、例外が発生します。 itoa "ゲーム"がなければ私は問題があるとは思わない。 TextOutAは私がwinapiを使うからです。新規および削除char *例外が発生する

char* p1 = new char[2]; 
itoa(10,p1,10); 
TextOutA(hDC,5, currenty,p1,2); 
delete[] p1; 

答えて

7

あなたのStringBufferはitoaはがNULL終端文字を書き込むことで、バッファ容量をオーバーラン

短すぎます。

char* p1 = new char[3]; 
itoa(10,p1,10); 
TextOutA(hDC,5, currenty,p1,2); 
delete[] p1; 

バッファを完全な整数範囲に対応できる大きさにすることをお勧めします。

編集念のために、文字列ストリームの提案に起草:

#include <sstream> 

//.... 
{ 
    std::stringstream ss; 
    ss << 10; 
    std::string s = ss.str(); 
    TextOutA(hDC, 5, currenty, s.c_str(), s.length()); 
} 
+3

'std :: ostringstream'と' std :: string'を使うことをお勧めします。バッファのサイズを気にする必要はありません。 (このような単純なケースでは、単に 'boost :: lexical_cast 'を使うことができます。) –

+0

@James:あまりにももちろん – sehe

+0

素早い応答がありがとう!働いた! – dusm

2

あなたは、すべてのCの文字列のように、それはN + 1つの文字をとり、ので、「10」を格納するのに十分なスペースが割り当てられていませんNは文字列の長さです。最後の文字はヌルターミネータです。 3文字以上を割り当てる必要があります。またはsnprintfを使用してください。またはstd::stringstream

much better alternativesからitoaまでの数字があります(特殊な基数フォーマットは必要ありませんが、その一部でも可能です)。

0

文字列に十分なスペースを割り当てていません。

char* p1 = new char[2]; 
itoa(10,p1,10); 

p1(他の文字はNULターミネーターである)1文字列に対してのみ十分である、2バイト長です。可能な結果を​​保持するのに十分な長さにする必要があります。これは、32ビットシステムでは11、ベースでは10です。

関連する問題