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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
-THE_MASTER666-
Заблокирован
#1

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

18.11.2014, 15:10. Просмотров 2821. Ответов 67
Метки нет (Все метки)

Привет!
Допустим:
C++
1
2
3
4
5
6
7
8
9
10
class TEST
{
public:
    TEST();
    ~TEST();
    void DelMe()
    {
        //DEL ME :-)
    }
};
Вот в теле функции DelMe можно как то удалить собственный экземпляр класса? То есть удалить самого себя из себя?

Добавлено через 4 минуты
Вот так вроде работает, но как - то это ..... Так память нормально освобождается?
C++
1
2
3
4
  void DelMe()
    {
        delete this;
    }
деструктор вроде вызывается

Добавлено через 4 минуты
Нашёл себе методичку: http://www.parashift.com/c++-faq-lite/delete-this.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 15:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли удалить объект экземпляра класса из самого себя? (C++):

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

Можно ли заставить класс записывать самого себя в файл? - C++
то есть class A{ int q,w,e; bool Write(); }; main(){ A a1; a1.write();// и он записывает сам себя в файл, не...

Можно ли получить ссылку на экземпляр класса по полю этого экземпляра - C++
схематично код такой - class A { static void staticMethodA(SomeClass* memberA); SomeClass* memberA; } void...

Создание нового экземпляра дочернего класса из экземпляра базового - C++
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... У меня есть несколько классов: все они...

При создании экземпляра класса, создается 2 экземпляра вместо 1 - C++
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех конструкторах (1. по умолчанию, 2. со всеми...

67
-THE_MASTER666-
Заблокирован
19.11.2014, 21:11  [ТС] #31
Цитата Сообщение от DrOffset Посмотреть сообщение
Deleter только должен быть чуть другим
Каким именно?
Давай дожмём уже этот вопрос

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Имхо, тащить boost лучше, чем тащить Qt.
Да я Qt чисто из - за GUI тащу, так то он мне и в ... пень не пился Вот если б С++ 14 включал бы в себя какие - то элементы GUI или рендеры типа DirectX - вот это было бы дело
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 21:12 #32
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Каким именно?
C++
1
2
3
4
5
6
7
8
9
static void myDeleter(MyObject *obj) // функция внутри dll
{
    delete obj;
}
 
QSharedPointer<MyObject> myDllFunction()
{
    return QSharedPointer<MyObject>(new MyObject, &myDeleter);
}
0
-THE_MASTER666-
Заблокирован
19.11.2014, 21:16  [ТС] #33
Цитата Сообщение от DrOffset Посмотреть сообщение
static
Пугает static конечно ... Ну да ладно, поверю докам.
Спасибо тебе о великий ДокторСмещение за просветление моего окисленного котелка
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 21:26 #34
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Пугает static конечно
Почему пугает?
1
-THE_MASTER666-
Заблокирован
19.11.2014, 21:30  [ТС] #35
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему пугает?
А зачем оно, если можно и без него как в посте моём посте 29 - Можно ли удалить объект экземпляра класса из самого себя?
Ведь если он статик, то хз как там устроен этот QSharedPointer внутри, может в ЕХЕ он вызовет как - то делетор их ЕХЕ ...ахаха ну не знаю... Настораживает просто, ладно. Раз со статиком правильно - да будет так
0
hoggy
6639 / 2825 / 484
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
19.11.2014, 21:48 #36
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
void DelMe()
* * {
* * * * delete this;
* * }
Технически это сработает. Но это UB.
По стандарту this не может быть невалидным.
1
Убежденный
Системный программист
Эксперт С++
15620 / 7129 / 1128
Регистрация: 02.05.2013
Сообщений: 11,571
Записей в блоге: 1
Завершенные тесты: 1
19.11.2014, 22:09 #37
Здесь нет UB. Обычное удаление объекта, созданного new, через указатель.
Без этой конструкции ни один смарт-поинтер нельзя было бы написать.
В Boost, кстати, она в куче мест используется, в тех же потрохах shared_ptr.
1
hoggy
6639 / 2825 / 484
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
19.11.2014, 22:20 #38
Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь нет UB. Обычное удаление объекта, созданного new, через указатель.
Нет, не обычное.
Удаление объекта через указатель снаружи - это запуск его диструктора, и освобождение памяти.

Удаление объекта через указатель this - это освобождение памяти в момент, когда диструктор ещё не отработал.
Что в свою очередь опять запускает деструктор, а затем пытается освободить память...

http://rextester.com/HHPM24793

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Title of this code
 
#include <iostream>
using namespace std;
 
 
struct sample
{
    ~sample()
    {
        cout<<"dtor\n";
        delete this;
    }
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    sample* p = new sample;
    
    p->~sample();
    
}
И дело даже не в сайд-эффектах как таковых.
А в том, что в любом контексте, где доступен this (скоуп, в котором виден this объекта) this должен быть валиден.

Где то на хабре были статейки, о том, как лихо компилятор выпиливает проверки вида:
C++
1
if(this) ...
Потому что закладывается, что this всегда валидный. И соответственно может наоптимизировать.
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 22:30 #39
Цитата Сообщение от hoggy Посмотреть сообщение
C++
1
2
3
4
5
~sample() 
{ 
    cout<<"dtor\n"; 
    delete this; 
}
Насколько я видел, здесь никто не предлагал вызывать delete из деструктора.
0
hoggy
6639 / 2825 / 484
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
19.11.2014, 22:32 #40
Цитата Сообщение от DrOffset Посмотреть сообщение
Насколько я видел, здесь никто не предлагал вызывать delete из деструктора.
Цитата Сообщение от hoggy Посмотреть сообщение
И дело даже не в сайд-эффектах как таковых.
-------------
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 22:43 #41
Цитата Сообщение от hoggy Посмотреть сообщение
А в том, что в любом контексте, где доступен this (скоуп, в котором виден this объекта) this должен быть валиден.
И как это мешает создать метод, в котором будет такой код:
C++
1
2
3
4
void MyClass::Release()
{
    delete this;
}
А использоваться он будет так:
C++
1
2
3
4
5
MyClass * p = new MyClass();
 
//.....
 
p->Release();
?
0
hoggy
6639 / 2825 / 484
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
19.11.2014, 22:48 #42
Цитата Сообщение от DrOffset Посмотреть сообщение
И как это мешает создать метод
Никак.

с++ не запрещает вам делать UB.
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 22:51 #43
Цитата Сообщение от hoggy Посмотреть сообщение
с++ не запрещает вам делать UB.
И почему же это UB?
1
hoggy
6639 / 2825 / 484
Регистрация: 15.11.2014
Сообщений: 6,253
Завершенные тесты: 1
19.11.2014, 22:53 #44
Цитата Сообщение от DrOffset Посмотреть сообщение
И почему же это UB?
Цитата Сообщение от hoggy Посмотреть сообщение
this должен быть валиден.
-----------------------------------------------------
0
DrOffset
7312 / 4412 / 999
Регистрация: 30.01.2014
Сообщений: 7,245
19.11.2014, 22:56 #45
Цитата Сообщение от hoggy Посмотреть сообщение
this должен быть валиден.
А он валиден.
Предлагаю почитать вот это.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 22:56
Привет! Вот еще темы с ответами:

Сложение экземпляра базового класса и экземпляра наследника - C++
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения &quot;знал&quot;...

Можно-ли наследовать класс, в котором определен объект текущего класса? - C++
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B : public A {};

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
45
Yandex
Объявления
19.11.2014, 22:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru