Освобождение целого числа, хранящегося в стеке, без какого-либо связанного указателя или переменной

std::string выделяется в стеке (автоматическая продолжительность хранения) и назначается указателю. Тогда указатель будет установлен в нуль.

std::string* myString = &std::string("");
myString = nullptr;

Освобождается ли myString сразу после второй инструкции или только после возврата функции соответственно, если он является членом после уничтожения объекта.


person user1056903    schedule 18.09.2016    source источник
comment
Этот код не будет компилироваться. Опубликуйте реальный код.   -  person Cheers and hth. - Alf    schedule 18.09.2016
comment
Компилируется с VS 2015.   -  person user1056903    schedule 18.09.2016
comment
@user - Нет, если вы правильно установите уровень предупреждения. VS2015 сообщает предупреждение C4238: используется нестандартное расширение: class rvalue используется как lvalue. Вы не можете использовать адрес временного.   -  person Bo Persson    schedule 18.09.2016
comment
@ user1056903: К сожалению, это не настоящий компилятор C++, по крайней мере, если вы не настроите его правильно.   -  person Kerrek SB    schedule 18.09.2016
comment
Где целое число?   -  person juanchopanza    schedule 18.09.2016


Ответы (2)


Вы не можете назначить string указателю. Однако вы можете назначить адрес string указателю string. Позвольте мне изменить ваш код на допустимый C++:

std::string s = "";
std::string* s_ptr = &s;
s_ptr = nullptr;

Тот факт, что вы меняете значение указателя, который указывает на s, вообще не влияет на строку. Представьте, что вы пишете адрес дома друзей на листе бумаги. Разрушается ли дом, когда вы стираете адрес с этого клочка бумаги? К счастью, нет.

PS: Ну, предел этой аналогии в том, что в C++ вы можете использовать "бумагу" и сказать "разрушить дом по этому адресу" (иначе delete s_ptr, что было бы в этом случае очень неправильно, так как строка указатель указывает на то, что не был создан через new). К счастью, в жизни это не работает ;)

person 463035818_is_not_a_number    schedule 18.09.2016

Сам myString нигде не "освобождается", потому что он никогда не был выделен. myString был создан в автоматическом режиме.

Когда область, в которой было объявлено myString, завершается, myString выходит из области видимости и уничтожается. Если myString было объявлено в верхней области видимости функции, это происходит, когда функция возвращается. Пока его область действия не прекратится, сам myString остается действительным экземпляром указателя.

Первый оператор устанавливает myString для указания на временный объект, который немедленно уничтожается. Утверждение само по себе допустимо, но разыменование указателя с этой точки приведет к неопределенному поведению. Следующий оператор устанавливает указатель на nullptr, чтобы не возникало неопределенного поведения.

person Sam Varshavchik    schedule 18.09.2016
comment
Утверждение само по себе валидно..., знаменитые последние слова. - person Cheers and hth. - Alf; 18.09.2016
comment
т.е. ровно после первой инструкции myString может указывать на что угодно, верно? Что если myString объявлен как член? - person user1056903; 18.09.2016
comment
@user1056903 user1056903 Да, это неопределенное поведение. Но вы должны понимать, что это временная переменная, которая будет уничтожена сразу после ее выражения (перед запуском второй строки myString будет указывать на недопустимый адрес). Пока вы не сохраните возвращаемое значение (не его указатель), оно будет уничтожено и станет недействительным. - person Shmuel H.; 18.09.2016