2011-09-12 3 views
2

다음 코드가 있지만 예외가 발생합니다. itoa가 없다면 "게임"은 문제가 있다고 생각하지 않습니다. TextOutA는 내가 winapi를 사용하기 때문입니다.new 및 delete char * 예외가 발생합니다.

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

답변

7

귀하의 StringBuffer는 itoa는 널 종료 문자를 서면으로 버퍼 용량을 넘

너무 짧습니다.

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인데, 특수 기수 포맷이 필요 없다고 가정합니다 (일부는 그렇게 할 수도 있음).

0

문자열에 충분한 공간을 할당하지 않았습니다.

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

p1는 (다른 캐릭터가 종료 NUL이다) -1- 문자열 만 충분하는 2 바이트이다. 32 비트 시스템의 경우 11이고 기본 = 10 인 가능한 결과를 보유 할 수있을만큼 길게해야합니다.

관련 문제