LINUX.ORG.RU

Я познаю C++. А что, оператор delete не обнуляет указатель?

 , ,


0

4

Всегда думал, что конструкция:

delete obj;

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

А оно походу совсем не таг.

★★★★★

Ответ на: комментарий от next_time

Потому что if(..) del(x); сломается. Вообще об этом много в интернетах написано, в т.ч. почему именно цикл а не просто скобки {}.

http://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-...

google://define do while

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от vertexua

именно. проблема указателей в доступе памяти вне текущего контекста, даже если использовать двойной указатель, как подсказывает анонимус выше, проблема всё равно остаётся, т.к. на данный адрес могут ссылаться указатели совсем в другой ф-ции, а в текущей, или вызывающей текущую, как раз легко отследить удаление и бессмысленно дополнительно дёргаться.

кому, всё-таки, надо, всегда может использовать макросы, как написано выше.

наконец, delete на указатель лучше всего использовать в деструкторах, а не в обычных ф-циях.

next_time ★★★★★
()
Ответ на: комментарий от crutch_master

Но может быть отключен почти любым компилятором.

Мне плевать на твой компилятор, я говорю о языке. Я заявляю, что язык позволят это сделать, ты мне предлагаешь воспользоваться какими-то костылями, чтобы ограничить язык. Я что-то не припомню, чтобы в топике шла речь о каком-то кастрированном подмножестве С++.

Как заставить компилятор считать ошибкой, например, любые перегрузки, найдешь, умник?

Но зачем, дурик?

staseg ★★★★★
()
Ответ на: комментарий от next_time

почему не #define del(X) delete X; X = nullptr; ?

Потому-что X может быть выражением.

anonymous
()
Ответ на: комментарий от next_time

тогда почему не {delete X; X = nullptr;} ?

Потому-что if( true ) del( ptr ); else ...

П.С. вообще сишный препроцессор - УГ, не нужно его использовать.

anonymous
()
Ответ на: комментарий от next_time

и? оно верно отработает, в обоих случаях.

Тебе С++ противопоказан. if {}; else у него отработает, ага.

anonymous
()
Ответ на: комментарий от staseg

Я заявляю, что язык позволят это сделать

Язык вообще ничего не позволяет делать, т.к. это идея в чистом виде. Сделать что-то как раз таки позволяет реализация языка - т.е. компилятор.

дурик...perl мозг съел.

Кстати, почему ты до сих пор со мной споришь? Не уж то тебе LOR мозг съел?

crutch_master ★★★★★
()
Ответ на: комментарий от next_time

он там вообще не нужен, это кретинизм стандарта, что перед else ";" обязательна

Выкинь си, пиши на паскале

vzzo ★★★
()
Ответ на: комментарий от vzzo

А ещё я хочу уметь писать delete new int и free(malloc(4))

А меня вообще бесит, что в Си/Cb++ есть тип «Указатель на ...», и при этом не предусмотрено определение переменных типа «Указатель на...».

Это же маразм:

int* a,b,c;

Имеем a как указатель и b и c как инты.

Xintrea ★★★★★
() автор топика

Перегрузи!

// тред не читал

lovesan ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.