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

Как удалить объект, который это попросил? - C++

Восстановить пароль Регистрация
 
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.06.2014, 14:43     Как удалить объект, который это попросил? #1
Сам вопрос возник, когда работал с Qt и их системой signal/slot. Проблема на С++ выглядела бы так:
Есть два объекта: А(асинхронный) и О(ожидающий).
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
26
27
28
29
30
31
32
struct O
{
    A *a;
    int downloadsAmount;
    MainObject *parent;
    
    void run() // Этот метод запускается в отдельном потоке. После его окончания, поток завершается
    {
        a = new A(this);
        a->download(); // Так же создает ещё один поток для метода download();
    }
    
    void downloadFinished()
    {
        ++downloadsAmount;
        parent->data = a->data; // по некоторым причинам, Data не является указателем
        // После сохранения data в MainObject, поток А тоже завершится (на самом деле в методе download(O *parent), но не суть. Главное, что теперь копия данных в А осталась без именений - её никто не удалил. В идеале было бы сделать, как ниже :
        
        // delete a; // но так нельзя, ведь после этого метода поток вернется в методе структуры А. Да, там больше нет обращения к данным А, но всё равно - это неправильно. В моем случае, это ошибка.
    }
}
 
struct A
{
    Data d; // не указатель
    
    void download(O *parent)
    {
        /*скачиваем*/
        parent->downloadFinished();
    }
}
Как удалить объект А, созданный в другом потоке, который завершил свое исполнение? Единственное, что я придумал, это занести его в какой-то глобальный
C++
1
vector < BaseObject * > crap;
- и каждую итерацию чего-нибудь очищать этот вектор. Само собой для вектора понадобится мьютекс, иначе не thread-safe. Есть ли иное решение?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.06.2014, 20:34  [ТС]     Как удалить объект, который это попросил? #21
Tulosba,

Не по теме:

почему так лучше не делать? Закинул другому классу указатель на "родителя"


Как уже писал выше, умный указатель не поможет.
Renji, как вариант, но статический класс ради такого.. Сработает, но выглядит страшно (:
Tulosba, опять-таки, разве delete this не UB?
Renji,

давайте я немного изменю условие. Есть объекты классов А и В, как в примере. ВНЕЗАПНО, появился поток, исполняющий download() класса В, который в конце этого метода перестанет существовать. Как этому потоку, исполняющему метод класса В удалить объект класса В?
Как уже писал выше, способ
C++
1
 vector < Object* > crap
не подходит по причине того, что нельзя точно узнать, завершился ли поток (signal/slot в Qt в асинхронном режиме)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.06.2014, 20:49     Как удалить объект, который это попросил? #22
Да ладно? Где это сказано, что delete this нельзя делать? Если после dеlеtе гарантированно не происходит обращений к полям данного объекта, то вполне можно!
Renji
1532 / 980 / 238
Регистрация: 05.06.2014
Сообщений: 2,950
13.06.2014, 20:50     Как удалить объект, который это попросил? #23
давайте я немного изменю условие. Есть объекты классов А и В, как в примере. ВНЕЗАПНО, появился поток, исполняющий download() класса В, который в конце этого метода перестанет существовать. Как этому потоку, исполняющему метод класса В удалить объект класса В?
Для удаления объекта класса B требуется:
1) Убедиться что на него больше никто не ссылается/не ссылался изначально/обнулить все ссылки на объект.
2) Выполнить delete.
Один у вас поток или несколько, ничего принципиально не меняется.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.06.2014, 21:17  [ТС]     Как удалить объект, который это попросил? #24
Kuzia domovenok, примерно с год-два назад здесь и научили меня сторожилы, что нельзя delete this, даже если не происходит ничего после.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 21:35     Как удалить объект, который это попросил?
Еще ссылки по теме:

Что значит константный указатель на объект, указатель на константный объект, и как это можно использовать? C++
Нужно удалить слова как это сделать? C++
C++ Как удалить объект списка list?

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

Или воспользуйтесь поиском по форуму:
Убежденный
Системный программист
 Аватар для Убежденный
14175 / 6190 / 981
Регистрация: 02.05.2013
Сообщений: 10,296
Завершенные тесты: 1
13.06.2014, 21:35     Как удалить объект, который это попросил? #25
Сообщение было отмечено автором темы, экспертом или модератором как ответ
this - это просто указатель на объект класса.
Если this указывает на объект, созданный в динамической памяти, к
нему вполне допустимо применять конструкцию "delete this", что
эквивалентно "delete ptr_to_object". Ни к каким побочным эффектам или
неопределенному поведению это не приведет. Такая конструкция
повсеместно используется, например, в COM. Там объект разрушает
сам себя, когда его счетчик ссылок становится равным нулю.
Yandex
Объявления
13.06.2014, 21:35     Как удалить объект, который это попросил?
Ответ Создать тему
Опции темы

Текущее время: 15:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru