new и delete char * вызывает исключение - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть следующий код, но он вызывает исключение. Без "игр" в Италии я не думаю, что есть проблема. TextOutA потому что я использую winapi.

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

Ответы [ 3 ]

7 голосов
/ 12 сентября 2011

Ваш 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());
}
2 голосов
/ 12 сентября 2011

Вы не выделили достаточно места для хранения "10", потому что, как и все строки C, требуется N + 1 символов, где N - длина строки.Последний символ - нулевой терминатор.Вы должны выделить 3 символа (или более).Или используйте snprintf.Или std::stringstream.

Вот ряд гораздо лучших альтернатив для использования itoa, при условии, что вам не нужно специальное радикальное форматирование (хотя некоторые из них могут сделать это тоже).

0 голосов
/ 12 сентября 2011

Вы не выделяете достаточно места для строки.

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

p1 имеет длину 2 байта, что достаточно только для 1-символьной строки (другой символ - нулевой терминатор). Вы должны сделать его достаточно длинным, чтобы вместить любой возможный результат, который будет 11 для 32-битной системы и base = 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...