[VS.NET 2003 7.1.3088] Парадокс или ошибка?
Здесь возвращается ссылка на переменную s, которая будет удалена при выходе из функции lpcstr
LPCSTR x = (LPCSTR)s.c_str;
MsgBox(x);
return x;
Т.е. строка, создающаяся в .c_str адрес которой помещается в x, а потом в EAX, удаляется при выходе из функции? А как s узнает о том, что я выхожу из функции, там есть аналог AddRef-Release, который говорит, что ссылок на эту строку 0, когда происходит выход из области видимости x?
s у тебя уничтожается при выходе из lpcstr
У тебя две разные s.
Одна в WinMain-е и одна в lpcstr
при вызове lpcstr происходит копирование первой s во вторую.
при выходе из lpcstr вторая s уничтожается.
ps
если изменить заголовок функции lpcstr на
LPCSTR lpcstr(string& s)
то копирования с последующим уничтожением происходить не будет.
Ага. Понятно. А почему работает в VC6? Память остается нетронутой?
Повезло. Освобожденную память никто не успел переписать.
P.S. только надо <crtdbg.h> подрубить вроде. В MFC-проектах это автоматом делается
А почему работает в VC6?Ну у разных студий же разные STL-и. Можно представить себе реализацию std::string, которая размещает c_str в статической памяти, тогда она будет валидна до следующего вызова c_str у какой-нибудь другой строки.
А вот говорят что Both data and c_str are owned by the string.

Оставить комментарий
Vladislav177Rus
Новый проект > С++ > Win32 Application > Empty projectДобавить > новый С++ файл
Вставить: Проделать аналогичные действия в VC++ 6
Запустить.
VS.NET: выдается окно с мсгбоксом
затем
VC++ 6:
Два раза
Поддается ли это разумному объяснению?