Это небезопасно, отчасти потому, что вы удаляете const
, но что более важно, потому что вы возвращаете указатель на массив, который будет возвращен при возврате функции.
Когда вы пишете
ss.str().c_str()
Возвращаемое значение c_str()
действительно только до тех пор, пока существует объект string
, для которого вы его вызвали.Подпись stringstream::str()
является
string stringstream::str() const;
. Это означает, что она возвращает временный string
объект.Следовательно, как только строка
ss.str().c_str()
завершает выполнение, временный объект string
восстанавливается.Это означает, что выдающийся указатель, полученный вами через c_str()
, больше не действителен, и любое его использование приводит к неопределенному поведению.
Чтобы это исправить, если вы действительно должны вернуть unsigned char*
, вынеобходимо вручную скопировать строку в стиле C в собственный буфер:
/* Get a copy of the string that won't be automatically destroyed at the end of a statement. */
string value = ss.str();
/* Extract the C-style string. */
const char* cStr = value.c_str();
/* Allocate a buffer and copy the contents of cStr into it. */
unsigned char* result = new unsigned char[value.length() + 1];
copy(cStr, cStr + value.length() + 1, result);
/* Hand back the result. */
return result;
Кроме того, как указал @Als, удаление const
является плохой идеей, если вы планируетеизменение содержимого.Если вы не изменяете содержимое, все должно быть в порядке, но тогда вы должны вернуть const unsigned char*
вместо unsigned char*
.
Надеюсь, это поможет!