C ++ std: модель строковой памяти - PullRequest
2 голосов
/ 22 марта 2011

Следующий код (часть цикла запрос-ответ на сетевом сервере) работает большую часть времени, но иногда не работает, так как клиент сообщит, что получил какую-то странную другую строку (казалось бы, случайные байты из расположений поблизости в памяти в этой функции, или нулевые байты).

string res = "";
if (something) {
    res = "ok";
}

if (res.length() > 0) {
    send_data((void*) res.c_str(), res.length());
}

Мне кажется, что "" и "ok" являются константами std: strings, а res - указатель на любой из них, и поэтому все должно работать, но, очевидно, это не так Кто-нибудь, пожалуйста, объясните мне, что здесь происходит?

Ответы [ 2 ]

6 голосов
/ 22 марта 2011

Возможно, вы забыли отправить нулевой терминатор для обозначения конца строки:

send_data((void*) res.c_str(), res.length()+1);
1 голос
/ 22 марта 2011

Ваш код в порядке, я полагаю, в вашей программе есть некоторые повреждения памяти.

"" и "ok" фактически являются буферами с нулевым окончанием типа 'const char *', а не строками. Когда вы присваиваете их вашей строке, все их данные копируются во внутренний буфер строки, не включая последний символ, который равен нулю, поэтому

res = "";

очистит внутренний строковый буфер, а res.length () станет 0.

res.c_str () вернет адрес этого буфера, а не адрес литералов "" или "ok".

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