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

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

18.11.2014, 15:10. Показов 16347. Ответов 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++-f... -this.html
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2014, 15:10
Ответы с готовыми решениями:

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

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

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

67
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
18.11.2014, 15:16
Но тогда нельзя делать то, что я закомментировал:
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  [ТС]
Цитата Сообщение от 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
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:37
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
хочу что - то в этом духе
Видя refCount, рефлекторно вспоминается std::shared_ptr.
0
Заблокирован
18.11.2014, 15:41  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
рефлекторно вспоминается std::shared_ptr.
Да... И COM вспоминает
Смысл в следующем:
1. В какой - то одной функции хочу создать объект
2. Передать указатель на него во множество других функций в разных потоках, при этом потеряв его в исходной функции их п.1. Ну просто функция из п.1 передаст указатели в другие функции в разных потоках и выйдет за SCOPE.
3. В других потоках в функциях "приёмниках" я что - то сделаю с этим экземпляром класса и потом вызову его Release(), в итоге хочу, чтоб после того, как все потоки что - то сделают с этим объектом, он самоудалился
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:44
-THE_MASTER666-, классика. Решение сказал выше.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.11.2014, 15:48
Лучший ответ Сообщение было отмечено -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  [ТС]
Цитата Сообщение от 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Эксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.11.2014, 15:52
Так вы либо освобождаете ресурсы, либо нет. Если нужен только один указатель - используйте std::unique_ptr с мув семантикой.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 15:57
delete
1
Заблокирован
18.11.2014, 15:57  [ТС]
ForEveR, всё, понял, спасибо! Значит QSharedPointer глючит.
0
Заблокирован
18.11.2014, 16:09  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
используйте std::unique_ptr
А можно буквально в двух словах, для чего нужен std::unique_ptr? Это синглтон что ли?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:10
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно буквально в двух словах, для чего нужен std::unique_ptr?
Обертка над указателем для автоматического вызова delete при выходе из области видимости. Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса (несколько сущностей не могут владеть одним unique_ptr).
1
Заблокирован
18.11.2014, 16:16  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
для автоматического вызова delete
Ну это я понял - гуд.
Цитата Сообщение от 0x10 Посмотреть сообщение
Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса
Ну и ладно, то есть если я его во множество потоков передам, то он удалится сразу же после выхода за SCOPE первой завершённой поточной функции, если брать во за основу пример ForEveR ?
Цитата Сообщение от 0x10 Посмотреть сообщение
несколько сущностей не могут владеть одним unique_ptr
Это как? То есть я его не смогу передать во множество потоков? Или смогу, но одновременно работать во множестве потоках с ним не смогу?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:22
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть я его не смогу передать во множество потоков?
У него нет ни конструктора копирования, ни оператора присваивания. Т.е. его можно только переместить.
Передать внутренний сырой указатель можно - но тогда приемник не сможет проверить его валидность, как и не сможет продлить время жизни объекта.
1
Заблокирован
18.11.2014, 16:31  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
У него нет ни конструктора копирования, ни оператора присваивания.
А..понял
Цитата Сообщение от 0x10 Посмотреть сообщение
Т.е. его можно только переместить.
Ну я же могу его переместить его сразу в два потока?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.11.2014, 16:32
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

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

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

Решение

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

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

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2014, 13:00
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru