2013-10-08 2 views
1

Я нижеуказанные функции в C++/MFC:станд :: строка c_str() сфера после возвращения из функции

CString StringFunc() 
{ 
    std::string abc = "Hello"; 

    return abc.c_str(); 

} 

int main() 
{ 
    CString Temp = StringFunc(); 

    Use_Temp(Temp); 
} 

1.) Что было бы жизни abc.c_str указателя() возвращенного StringFunc(), будет ли он безопасно скопирован в переменную «Temp» после возврата StringFunc()?

2.) CString Temp = StringFunc() - операция с мелкой копией или глубокое копирование?

+0

Ваш код не был отступом вообще, и вы использовали 'void main'. Я отредактировал вопрос, чтобы исправить эти проблемы. –

ответ

3

Что бы срок службы abc.c_str указателя() возвращенного StringFunc(), будет ли это безопасно копируется в переменную 'Temp' после того, как StringFunc() возвращает?

abc будет действителен до StringFunc() function. Да, безопасно вернуть копию в CString.

Если вы возвращаете указатель на std::string::c_str() то это опасно, например:

const char* EvilFunc() // bad, dont' do it 
{ 
    std::string abc = "Hello"; 
    return abc.c_str(); 
} 

const char* p = EvilFunc(); // p becomes wild pointer when EvilFunc returns 

CString Temp = StringFunc() представляет собой неглубокую операции копирования или глубокое копирование?

Это глубокая копия. он строит новый объект CString от const char*

+2

Как сделать EvilFunc хорошим? У меня такой же сценарий, что инструмент обложки сообщает о некоторой проблеме при возврате c_str(). – Pavan

0

Да, память безопасно скопирована в объект Cstring, возвращенный функцией. Это глубокая копия. Even the documentation says so:

Поскольку конструкторы скопировать входные данные в новой выделенной хранения, вы должны знать, что исключения из памяти может привести.

2

Ad.1) - Вы не возвращаете указатель на char, вы возвращаете экземпляр CString, неявно построенный из этого указателя. CString берет копию переданных символов.

Ad.2) - Копирование или назначение CString создает глубокую копию.

0

1.): Срок службы char const * возвращаемого c_str() только до тех пор, как поток управления находится внутри функции StringFunc, так как строка переменной abc будет уничтожен в конце этой функции. Однако, поскольку вы возвращаете значение CString по значению, временное неявно создается из результата c_str() и возвращается CString; это временное возвращаемое значение, в свою очередь, действует до конца выражения, которое вызывает вызов функции (т. е. весь оператор, где вы назначаете результат функции StringFunc на temp). Поэтому результат из вашего StringFunc безопасно скопирован в вашу переменную Temp в main.

2.) Это «глубокая» копия, вы строите там новый объект! Поскольку вы возвращаетесь по значению, ваш компилятор будет, скорее всего, вообще избегать копирования чего-либо (см. Return-Value optimization) и вместо этого просто построит один объект.

Смежные вопросы