new和delete char *会导致异常

时间:2011-09-12 09:18:09

标签: c++ winapi

我有以下代码,但它会导致异常。如果没有itoa“游戏”,我认为没有问题。 TextOutA是因为我使用winapi。

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

3 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:2)

您没有分配足够的空间来存储“10”,因为与所有C字符串一样,它需要N + 1个字符,其中N是字符串的长度。最后一个字符是空终止符。您应该分配3个字符(或更多)。或者使用snprintf。或std::stringstream

以下是使用itoa的{​​{3}}个数,假设您不需要专门的基数格式(虽然其中一些也可以这样做)。

答案 2 :(得分:0)

您没有为字符串分配足够的空间。

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

p1长度为2个字节,仅适用于1个字符的字符串(另一个字符是nul终结符)。你应该把它做得足够长,以保持任何可能的结果,对于32位系统,基数= 10,结果为11。