Форум программистов, компьютерный форум CyberForum.ru

Можно ли удалить объект экземпляра класса из самого себя? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти количество чисел в массиве типа char http://www.cyberforum.ru/cpp-beginners/thread1303976.html
задание полностью стоит следующее: в массиве типа char вывести только те слова, которые состоят из латинских букв и вывести количество чисел в массиве, если такие имеются. Числе, не цифр! #include<iostream> #include<string.h> #include <stdlib.h> using namespace std; int main() { char text;//ñòðîêà
C++ Удалить элементы главной диагонали Удалить элементы главной диагонали Почему не работает? for (i=0; i<n; i++) for (j=0; j<m-1; j++) if (i=j) for (i=j; i<n-1; i++) mas=mas; cout<<"our array\n"; http://www.cyberforum.ru/cpp-beginners/thread1303975.html
Создание, просмотр и удаление элементов списка, организованного по принципу LIFO C++
Что делать? Программа просит идентификатор true, false. #include "stdafx.h" #include <iostream> #include <process.h> #include <conio.h> using namespace std; //визначення перелічуваного типу користувача boolean enum boolean(true, false); //визначення шаблону елемента списку за допомогою типу struct struct stack{
Обработка двумерного массива: найти количество строк и номер столбца по условию C++
#include <iostream> #include <iomanip> using namespace std; const int N=20; const int M=20; int main() { double a;
C++ Подскажите.Как вывести N-ую строку или столбец из матрицы? http://www.cyberforum.ru/cpp-beginners/thread1303921.html
Подскажите.Как вывести N-ую строку или столбец из матрицы?
C++ Ошибка "stack around the variable 'n' was corrupted." Есть такая программа. Натуральные числа от 0 до n(a0-an) Необходимо найту сумму всех чисел кратных 5. Выдает ошибку stack around the variable 'n' was corrupted. Почему? #include <clocale> #include <cstdio> int main(){ setlocale(LC_ALL, "Russian"); int n, a, sum=0; printf("введите n"); подробнее

Показать сообщение отдельно
Убежденный
Системный программист
 Аватар для Убежденный
14219 / 6234 / 988
Регистрация: 02.05.2013
Сообщений: 10,396
Завершенные тесты: 1
23.11.2014, 10:29     Можно ли удалить объект экземпляра класса из самого себя?
Цитата Сообщение от hoggy Посмотреть сообщение
Честно? Лень искать.
В таком случае я отписываюсь.

Цитата Сообщение от hoggy Посмотреть сообщение
Если вам это интересно, то вы можете попробовать загуглить на хабре. Там вроде бы были какие то ссылки на стандарт.
C++03, "5.3.5 Delete" и "9.3.2 The this pointer": ни слова о том,
что "delete this" ведет к неопределенному поведению.
Ни явно, ни косвенно.

И зачем Хабр ?
Давайте заглянем на более авторитетный в таких вопросах ресурс - isocpp.org:

Memory Management
https://isocpp.org/wiki/faq/freestore-mgmt#delete-this
Q: Is it legal (and moral) for a member function to say delete this?

A: As long as you’re careful, it’s okay (not evil) for an object to commit suicide (delete this).

Here’s how I define “careful”:

1. You must be absolutely 100% positively sure that this object was allocated
via new (not by new[], nor by placement new, nor a local object on the stack, nor a
namespace-scope / global, nor a member of another object; but by plain ordinary new).

2. You must be absolutely 100% positively sure that your member function will be the
last member function invoked on this object.

3. You must be absolutely 100% positively sure that the rest of your member
function (after the delete this line) doesn’t touch any piece of this object
(including calling any other member functions or touching any data members).
This includes code that will run in destructors for any objects allocated on the
stack that are still alive.

4. You must be absolutely 100% positively sure that no one even touches the this
pointer itself after the delete this line. In other words, you must not examine it,
compare it with another pointer, compare it with nullptr, print it, cast it, do
anything with it.

Naturally the usual caveats apply in cases where your this pointer is a pointer to a
base class when you don’t have a virtual destructor.
---

Цитата Сообщение от hoggy Посмотреть сообщение
Ну или вы можете проверить следующую информацию:
AC>Ну, помниться был такой классный топик, что-то типа NULL и this. И насколько я понимаю _НИГДЕ_ не написано что this _НЕ_МОЖЕТ_ быть нулевым. Разве что ((X*)0)->f имеет неопределённое поведение в общем случае и совершенно определённое для вызова невиртуальной функции по типу указателя для которого эта функция была определена. Тоесть явного запрета на 0 as this нигде нет. Так что насщёт хака можно и поспорить )))

Потому что этот запрет следует из двух положений:
1) 9.3.2/1 In the body of a nonstatic (9.3) member function, the keyword this is a non-lvalue expression whose value is the address of the object for which the function is called.
2) не существует объектов с адресом 0.
Все верно. This - это адрес объекта, а объектов с адресом 0 в С++ существовать не может.
Только к "delete this" это не имеет никакого отношения.
 
Текущее время: 11:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru