Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
-THE_MASTER666-
Заблокирован
#1

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

18.11.2014, 15:10. Просмотров 3500. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

67
zss
Модератор
Эксперт С++
6989 / 6551 / 4154
Регистрация: 18.12.2011
Сообщений: 17,286
Завершенные тесты: 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();
}
1
-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;
хочу что - то в этом духе
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 15:37 #4
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
хочу что - то в этом духе
Видя refCount, рефлекторно вспоминается std::shared_ptr.
0
-THE_MASTER666-
Заблокирован
18.11.2014, 15:41  [ТС] #5
Цитата Сообщение от 0x10 Посмотреть сообщение
рефлекторно вспоминается std::shared_ptr.
Да... И COM вспоминает
Смысл в следующем:
1. В какой - то одной функции хочу создать объект
2. Передать указатель на него во множество других функций в разных потоках, при этом потеряв его в исходной функции их п.1. Ну просто функция из п.1 передаст указатели в другие функции в разных потоках и выйдет за SCOPE.
3. В других потоках в функциях "приёмниках" я что - то сделаю с этим экземпляром класса и потом вызову его Release(), в итоге хочу, чтоб после того, как все потоки что - то сделают с этим объектом, он самоудалился
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 15:44 #6
-THE_MASTER666-, классика. Решение сказал выше.
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
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
-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();
0
MrGluck
Модератор
Эксперт CЭксперт С++
8054 / 4898 / 1426
Регистрация: 29.11.2010
Сообщений: 13,297
18.11.2014, 15:52 #9
Так вы либо освобождаете ресурсы, либо нет. Если нужен только один указатель - используйте std::unique_ptr с мув семантикой.
0
-THE_MASTER666-
Заблокирован
18.11.2014, 15:57  [ТС] #10
ForEveR, всё, понял, спасибо! Значит QSharedPointer глючит.
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 15:57 #11
delete
1
-THE_MASTER666-
Заблокирован
18.11.2014, 16:09  [ТС] #12
Цитата Сообщение от MrGluck Посмотреть сообщение
используйте std::unique_ptr
А можно буквально в двух словах, для чего нужен std::unique_ptr? Это синглтон что ли?
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 16:10 #13
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно буквально в двух словах, для чего нужен std::unique_ptr?
Обертка над указателем для автоматического вызова delete при выходе из области видимости. Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса (несколько сущностей не могут владеть одним unique_ptr).
1
-THE_MASTER666-
Заблокирован
18.11.2014, 16:16  [ТС] #14
Цитата Сообщение от 0x10 Посмотреть сообщение
для автоматического вызова delete
Ну это я понял - гуд.
Цитата Сообщение от 0x10 Посмотреть сообщение
Отсутствует счетчик ссылок и, как следствие, семантика разделяемого ресурса
Ну и ладно, то есть если я его во множество потоков передам, то он удалится сразу же после выхода за SCOPE первой завершённой поточной функции, если брать во за основу пример ForEveR ?
Цитата Сообщение от 0x10 Посмотреть сообщение
несколько сущностей не могут владеть одним unique_ptr
Это как? То есть я его не смогу передать во множество потоков? Или смогу, но одновременно работать во множестве потоках с ним не смогу?
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 16:22 #15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть я его не смогу передать во множество потоков?
У него нет ни конструктора копирования, ни оператора присваивания. Т.е. его можно только переместить.
Передать внутренний сырой указатель можно - но тогда приемник не сможет проверить его валидность, как и не сможет продлить время жизни объекта.
1
-THE_MASTER666-
Заблокирован
18.11.2014, 16:31  [ТС] #16
Цитата Сообщение от 0x10 Посмотреть сообщение
У него нет ни конструктора копирования, ни оператора присваивания.
А..понял
Цитата Сообщение от 0x10 Посмотреть сообщение
Т.е. его можно только переместить.
Ну я же могу его переместить его сразу в два потока?
0
0x10
2569 / 1749 / 287
Регистрация: 24.11.2012
Сообщений: 4,373
18.11.2014, 16:32 #17
Лучший ответ Сообщение было отмечено -THE_MASTER666- как решение

Решение

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

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

Решение

Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
А можно ли этот shared_ptr передавать из одной DLL в другую?
Не отвечу точно. Предлагаю почитать: http://stackoverflow.com/questions/1...dll-interfaces
1
-THE_MASTER666-
Заблокирован
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 13:00

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

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

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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