Я снимаю соответствующий код для каждой функции и обработки ее возвращаемого значения, и комментирую ниже:
const char* func1() {
const char* s = "this is a literal string";
return s;
}
const char* s1 = func1();
delete s1; //?
Вы не можете удалить s1
, поскольку строка, на которую она указывает, не живеткуча.
string func2() {
string s = "this is a literal string";
return s;
}
string s2 = func2();
Это нормально.func2
s s
выходит из области видимости и очищается.s2
продублирует строку из s
, а также очистит себя в конце func
.
const char* func3() {
string s = "this is a literal string";
return s.c_str();
}
const char* s3 = func3();
delete s3; //?
func3
вернет указатель на освобожденную строку.Вы получите двойное бесплатное исключение при исполнении delete s3
.