Почему возвращать const char * из функции - не лучшая идея?

Вот еще один вопрос о возврате const char * из функции.

Но я пробовал это со следующими кодами, похоже, все работает нормально.

#include <iostream>
#include <string>

using namespace std;

const char * tocstring(){
    string str = "abcd";
    return str.c_str();
}

int main(){
    const char * p = tocstring();
    cout << p << endl;
    return 0;
}

он выведет abcd, как я хочу. Есть идеи по этому поводу?


person Myzh    schedule 15.07.2015    source источник
comment
Я не могу объяснить это так же хорошо, как этот пост   -  person Tas    schedule 15.07.2015


Ответы (3)


он выведет abcd, как я хочу. Есть идеи по этому поводу?

Функция tocstring возвращает указатель, удерживаемый автоматической переменной str. Указатель недействителен после возврата из функции. Ваша программа подвержена неопределенному поведению. К сожалению, внешне нормальное поведение - это форма неопределенного поведения.

person R Sahu    schedule 15.07.2015
comment
Я проверил неопределенное поведение через стресс-тесты, и оно все еще нормально, но все еще не определено. - person Russell Greene; 15.07.2015

Ты был счастливчиком. tocstring возвращает указатель на память, которая уже была освобождена, так что это неопределенное поведение.

person sfjac    schedule 15.07.2015
comment
повезло или не повезло? Лучше бы я потерпел неудачу в первый раз, чем потом удивил меня. - person Mohit Jain; 15.07.2015

const char * tocstring(){                                                                         
    string str = "abcd";                                                                        
    return str.c_str();                                                                          
}

Здесь str - локальная переменная. Как только он выходит за пределы области видимости, вам больше не следует указывать на него. Это УБ.

person InQusitive    schedule 15.07.2015