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

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

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

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

18.11.2014, 15:10. Просмотров 2541. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 15:10     Можно ли удалить объект экземпляра класса из самого себя?
Посмотрите здесь:
Удаление экземпляра класса в функции самого класса (Ошибка при отладке) C++
как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? C++
Можно ли заставить класс записывать самого себя в файл? C++
C++ Можно ли получить ссылку на экземпляр класса по полю этого экземпляра
C++ При создании экземпляра класса, создается 2 экземпляра вместо 1
C++ Создание нового экземпляра дочернего класса из экземпляра базового
C++ Сложение экземпляра базового класса и экземпляра наследника
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6287 / 5890 / 1910
Регистрация: 18.12.2011
Сообщений: 15,122
Завершенные тесты: 1
18.11.2014, 15:16     Можно ли удалить объект экземпляра класса из самого себя? #2
Но тогда нельзя делать то, что я закомментировал:
C++
1
2
3
4
5
6
7
8
9
void main()
{
    TEST* t1=new TEST;
    t1->DelMe();
    //delete t1;
    //TEST t2;
    //t2.DelMe();
    getch();
}
-THE_MASTER666-
Заблокирован
18.11.2014, 15:32  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #3
Цитата Сообщение от zss Посмотреть сообщение
Но тогда нельзя делать то, что я закомментировал:
Само собой

Добавлено через 1 минуту
Хмм, а по идее можно же переопределить как - то оператор delete для класса?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TEST
{
public:
    TEST(){ refCount++; }
    ~TEST();
 
    void operator delete( void *obj )
    {
        refCount--;
        if(refCount < 1)
            delete obj;
    }
 
private:
    static int refCount;
};
int TEST::refCount = 0;
хочу что - то в этом духе
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 15:37     Можно ли удалить объект экземпляра класса из самого себя? #4
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
хочу что - то в этом духе
Видя refCount, рефлекторно вспоминается std::shared_ptr.
-THE_MASTER666-
Заблокирован
18.11.2014, 15:41  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #5
Цитата Сообщение от 0x10 Посмотреть сообщение
рефлекторно вспоминается std::shared_ptr.
Да... И COM вспоминает
Смысл в следующем:
1. В какой - то одной функции хочу создать объект
2. Передать указатель на него во множество других функций в разных потоках, при этом потеряв его в исходной функции их п.1. Ну просто функция из п.1 передаст указатели в другие функции в разных потоках и выйдет за SCOPE.
3. В других потоках в функциях "приёмниках" я что - то сделаю с этим экземпляром класса и потом вызову его Release(), в итоге хочу, чтоб после того, как все потоки что - то сделают с этим объектом, он самоудалился
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 15:44     Можно ли удалить объект экземпляра класса из самого себя? #6
-THE_MASTER666-, классика. Решение сказал выше.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
18.11.2014, 15:48     Можно ли удалить объект экземпляра класса из самого себя? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
-THE_MASTER666-, Используйте shared_ptr.

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
#include <iostream>
#include <memory>
#include <thread>
#include <chrono>
 
class A
{
public:
   ~A() { std::cout << "destructed" << std::endl; }
};
 
void another_thread_function(std::shared_ptr<A> a)
{
   std::this_thread::sleep_for(std::chrono::seconds(3));
   std::cout << "another_thread_function finished" << std::endl;
}
 
void thread_function()
{
   auto shared_a = std::make_shared<A>();
   std::thread thread(&another_thread_function, shared_a);
   thread.detach();
   std::cout << "Thread function goes out of scope" << std::endl;
}
 
int main()
{
   std::thread thread(&thread_function);
   thread.detach();
   std::this_thread::sleep_for(std::chrono::seconds(5));
}
-THE_MASTER666-
Заблокирован
18.11.2014, 15:50  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #8
Цитата Сообщение от 0x10 Посмотреть сообщение
-THE_MASTER666-, классика. Решение сказал выше.
Не, ну понят но, что shared_prt делает то же самое, но только не понятно, как его в исходной функции потерять, чтоб он не самоунечтожился и чтоб был вылиден в других функциях...
Вот чтоб память не терялась, что тут сделать надо?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void REMOTE(int* a)
{
    int z = *a * 2;
    //Как - то совободить a
}
 
void BASE()
{
    int* value = new int(777);
    REMOTE(a); //в другом потоке
    REMOTE(a); //в другом потоке
    REMOTE(a); //в другом потоке
}
 
int main(int argc, char *argv[])
{
    BASE();
MrGluck
Модератор
Эксперт CЭксперт С++
7000 / 4171 / 595
Регистрация: 29.11.2010
Сообщений: 11,067
18.11.2014, 15:52     Можно ли удалить объект экземпляра класса из самого себя? #9
Так вы либо освобождаете ресурсы, либо нет. Если нужен только один указатель - используйте std::unique_ptr с мув семантикой.
-THE_MASTER666-
Заблокирован
18.11.2014, 15:57  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #10
ForEveR, всё, понял, спасибо! Значит QSharedPointer глючит.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 15:57     Можно ли удалить объект экземпляра класса из самого себя? #11
delete
-THE_MASTER666-
Заблокирован
18.11.2014, 16:09  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #12
Цитата Сообщение от MrGluck Посмотреть сообщение
используйте std::unique_ptr
А можно буквально в двух словах, для чего нужен std::unique_ptr? Это синглтон что ли?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 16:10     Можно ли удалить объект экземпляра класса из самого себя? #13
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно буквально в двух словах, для чего нужен std::unique_ptr?
Обертка над указателем для автоматического вызова delete при выходе из области видимости. Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса (несколько сущностей не могут владеть одним unique_ptr).
-THE_MASTER666-
Заблокирован
18.11.2014, 16:16  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #14
Цитата Сообщение от 0x10 Посмотреть сообщение
для автоматического вызова delete
Ну это я понял - гуд.
Цитата Сообщение от 0x10 Посмотреть сообщение
Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса
Ну и ладно, то есть если я его во множество потоков передам, то он удалится сразу же после выхода за SCOPE первой завершённой поточной функции, если брать во за основу пример ForEveR ?
Цитата Сообщение от 0x10 Посмотреть сообщение
несколько сущностей не могут владеть одним unique_ptr
Это как? То есть я его не смогу передать во множество потоков? Или смогу, но одновременно работать во множестве потоках с ним не смогу?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 16:22     Можно ли удалить объект экземпляра класса из самого себя? #15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть я его не смогу передать во множество потоков?
У него нет ни конструктора копирования, ни оператора присваивания. Т.е. его можно только переместить.
Передать внутренний сырой указатель можно - но тогда приемник не сможет проверить его валидность, как и не сможет продлить время жизни объекта.
-THE_MASTER666-
Заблокирован
18.11.2014, 16:31  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #16
Цитата Сообщение от 0x10 Посмотреть сообщение
У него нет ни конструктора копирования, ни оператора присваивания.
А..понял
Цитата Сообщение от 0x10 Посмотреть сообщение
Т.е. его можно только переместить.
Ну я же могу его переместить его сразу в два потока?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
18.11.2014, 16:32     Можно ли удалить объект экземпляра класса из самого себя? #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Ну я же могу его переместить его сразу в два потока?
Очевидно, нет.
-THE_MASTER666-
Заблокирован
19.11.2014, 11:33  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #18
Цитата Сообщение от 0x10 Посмотреть сообщение
Очевидно, нет.
Ладно, всё понял - спасибо

Добавлено через 18 часов 54 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
-THE_MASTER666-, Используйте shared_ptr.
А можно ли этот shared_ptr передавать из одной DLL в другую?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
19.11.2014, 12:20     Можно ли удалить объект экземпляра класса из самого себя? #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно ли этот shared_ptr передавать из одной DLL в другую?
Не отвечу точно. Предлагаю почитать: http://stackoverflow.com/questions/1...dll-interfaces
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 13:00     Можно ли удалить объект экземпляра класса из самого себя?
Еще ссылки по теме:
C++ Можно-ли наследовать класс, в котором определен объект текущего класса?
Можно ли в поле private сконструировать объект с параметрами другого класса? C++
Явное создание экземпляра класса и явная специализация шаблона класса C++
Передача свойства одного экземпляра класса другому экземпляру класса C++
C++ Как построить экземпляр дочернего класса на основе готового экземпляра базового класса?

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

Или воспользуйтесь поиском по форуму:
-THE_MASTER666-
Заблокирован
19.11.2014, 13:00  [ТС]     Можно ли удалить объект экземпляра класса из самого себя? #20
Цитата Сообщение от ForEveR Посмотреть сообщение
Не отвечу точно. Предлагаю почитать
Чё то я запутался
В общем попробовал поиграть с QSharedPointer, всё нормально передаётся из DLL в EXE и деструктор корректно вызывается после потери последней ссылки при выходе за скоп.
Полагаю, что вообще в Qt с передачей данных DLL - EXE , как впрочем и использование шаблонов в DLL, всё тип топ, т.к. весь Qt построен на идеоме Pimpl, там повсюду private классы
В общем раз работает, то темя исчерпана, всё равно я на Qt пишу

Добавлено через 1 минуту

Не по теме:

ForEveR, нет какого - нибуть линка на статейку по собственному очень быстрому алокатору памяти?

Yandex
Объявления
19.11.2014, 13:00     Можно ли удалить объект экземпляра класса из самого себя?
Ответ Создать тему
Опции темы

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