Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
Заблокирован
1

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

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

Author24 — интернет-сервис помощи студентам
Привет!
Допустим:
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++-f... -this.html
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2014, 15:10
Ответы с готовыми решениями:

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или как то обойти эту...

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

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

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

67
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,719
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();
}
1
Заблокирован
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;
хочу что - то в этом духе
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:37 4
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
хочу что - то в этом духе
Видя refCount, рефлекторно вспоминается std::shared_ptr.
0
Заблокирован
18.11.2014, 15:41  [ТС] 5
Цитата Сообщение от 0x10 Посмотреть сообщение
рефлекторно вспоминается std::shared_ptr.
Да... И COM вспоминает
Смысл в следующем:
1. В какой - то одной функции хочу создать объект
2. Передать указатель на него во множество других функций в разных потоках, при этом потеряв его в исходной функции их п.1. Ну просто функция из п.1 передаст указатели в другие функции в разных потоках и выйдет за SCOPE.
3. В других потоках в функциях "приёмниках" я что - то сделаю с этим экземпляром класса и потом вызову его Release(), в итоге хочу, чтоб после того, как все потоки что - то сделают с этим объектом, он самоудалился
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:44 6
-THE_MASTER666-, классика. Решение сказал выше.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.11.2014, 15:48 7
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

-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));
}
1
Заблокирован
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();
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2014, 15:52 9
Так вы либо освобождаете ресурсы, либо нет. Если нужен только один указатель - используйте std::unique_ptr с мув семантикой.
0
Заблокирован
18.11.2014, 15:57  [ТС] 10
ForEveR, всё, понял, спасибо! Значит QSharedPointer глючит.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:57 11
delete
1
Заблокирован
18.11.2014, 16:09  [ТС] 12
Цитата Сообщение от MrGluck Посмотреть сообщение
используйте std::unique_ptr
А можно буквально в двух словах, для чего нужен std::unique_ptr? Это синглтон что ли?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:10 13
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно буквально в двух словах, для чего нужен std::unique_ptr?
Обертка над указателем для автоматического вызова delete при выходе из области видимости. Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса (несколько сущностей не могут владеть одним unique_ptr).
1
Заблокирован
18.11.2014, 16:16  [ТС] 14
Цитата Сообщение от 0x10 Посмотреть сообщение
для автоматического вызова delete
Ну это я понял - гуд.
Цитата Сообщение от 0x10 Посмотреть сообщение
Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса
Ну и ладно, то есть если я его во множество потоков передам, то он удалится сразу же после выхода за SCOPE первой завершённой поточной функции, если брать во за основу пример ForEveR ?
Цитата Сообщение от 0x10 Посмотреть сообщение
несколько сущностей не могут владеть одним unique_ptr
Это как? То есть я его не смогу передать во множество потоков? Или смогу, но одновременно работать во множестве потоках с ним не смогу?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:22 15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть я его не смогу передать во множество потоков?
У него нет ни конструктора копирования, ни оператора присваивания. Т.е. его можно только переместить.
Передать внутренний сырой указатель можно - но тогда приемник не сможет проверить его валидность, как и не сможет продлить время жизни объекта.
1
Заблокирован
18.11.2014, 16:31  [ТС] 16
Цитата Сообщение от 0x10 Посмотреть сообщение
У него нет ни конструктора копирования, ни оператора присваивания.
А..понял
Цитата Сообщение от 0x10 Посмотреть сообщение
Т.е. его можно только переместить.
Ну я же могу его переместить его сразу в два потока?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:32 17
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
Ну я же могу его переместить его сразу в два потока?
Очевидно, нет.
1
Заблокирован
19.11.2014, 11:33  [ТС] 18
Цитата Сообщение от 0x10 Посмотреть сообщение
Очевидно, нет.
Ладно, всё понял - спасибо

Добавлено через 18 часов 54 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
-THE_MASTER666-, Используйте shared_ptr.
А можно ли этот shared_ptr передавать из одной DLL в другую?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
19.11.2014, 12:20 19
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

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

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

Не по теме:

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

0
19.11.2014, 13:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2014, 13:00
Помогаю со студенческими работами здесь

Как можно удалить или очистить тело макроса после его исполнения из самого себя?
Скажите пожалуйста! Как можно удалить или очистить тело макроса после его исполнения из самого себя?

Чем отличается объект класса от экземпляра класса
Читаю книгу &quot;PHP Объекты, шаблоны и методики программирования&quot; автор Мэт Зандстра. Перевод на...

Зацыкливания класса на самого себя
scanner =new Scanner(System.in); System.out.println(&quot;Print&quot;); if(scanner.hasNextInt()){int...

Как экземпляру класса изменить тип самого себя?
Есть класс1, наследованный от класса класс-предок. Он лежит в list&lt;класс-предок&gt;. Нужно, не меняя...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru