C++ 新建和删除字符*会导致异常

C++ 新建和删除字符*会导致异常,c++,winapi,C++,Winapi,我有以下代码,但它会导致异常。如果没有itoa“游戏”,我不认为会有问题。TextOutA是因为我使用winapi char* p1 = new char[2]; itoa(10,p1,10); TextOutA(hDC,5, currenty,p1,2); delete[] p1; 您的字符串缓冲区太短 itoa在写入空终止字符时超出了缓冲区容量 char* p1 = new char[3]; itoa(10,p1,10); TextOutA(hDC,5, currenty,p1,2); d

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

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

您的字符串缓冲区太短

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());
}
#包括
//....
{
std::stringstream-ss;

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


假设您不需要专门的基数格式(尽管其中一些也可以这样做),这里有许多使用itoa的方法。

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

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

p1
的长度为2字节,仅足以容纳1个字符的字符串(另一个字符是nul终止符)。您应该使其足够长,以容纳任何可能的结果,对于32位系统为11,base=10。

我建议使用
std::ostringstream
std::string
,而不必担心缓冲区的大小。(在这样的简单情况下,您可以使用
boost::lexical\u cast
)@杰姆斯:在C++模式中添加了使用字符串流的示例,以防OP想要提示如何使用