С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

18.11.2014, 15:10. Просмотров 2999. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли удалить объект экземпляра класса из самого себя? (C++):

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

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

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

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

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

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

67
zss
Модератор
Эксперт С++
6580 / 6142 / 2024
Регистрация: 18.12.2011
Сообщений: 16,014
Завершенные тесты: 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
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
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
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
18.11.2014, 15:44 #6
-THE_MASTER666-, классика. Решение сказал выше.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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));
}
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Эксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,633
18.11.2014, 15:52 #9
Так вы либо освобождаете ресурсы, либо нет. Если нужен только один указатель - используйте std::unique_ptr с мув семантикой.
0
-THE_MASTER666-
Заблокирован
18.11.2014, 15:57  [ТС] #10
ForEveR, всё, понял, спасибо! Значит QSharedPointer глючит.
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
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
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
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
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,136
18.11.2014, 16:22 #15
Цитата Сообщение от -THE_MASTER666- Посмотреть сообщение
То есть я его не смогу передать во множество потоков?
У него нет ни конструктора копирования, ни оператора присваивания. Т.е. его можно только переместить.
Передать внутренний сырой указатель можно - но тогда приемник не сможет проверить его валидность, как и не сможет продлить время жизни объекта.
1
18.11.2014, 16:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.11.2014, 16:22
Привет! Вот еще темы с ответами:

Сложение экземпляра базового класса и экземпляра наследника - C++
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы результат сложения &quot;знал&quot;...

Можно-ли наследовать класс, в котором определен объект текущего класса? - C++
Подскажите, пожалуйста, можно-ли делать так: class A { public: B objB; }; class B : public A {};

Можно ли в поле private сконструировать объект с параметрами другого класса? - C++
Например у меня есть классы Basic и Second. Во 2-м классе есть конструктор с параметрами. Можно ли написать что-то типу такого? class...

Явное создание экземпляра класса и явная специализация шаблона класса - C++
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...


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

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

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