Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните конструкцию ptr->~ClassName() 
V
    Опции темы
Modul
Дата 24.3.2011, 16:49 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Привожу мою ерунду:

My.h

Код

#ifndef _My_h_
#define _My_h_

class My
{ 
    public:
        My();
        ~My();
        void setNumber();
        void getNumber(); 
        void create();

    private:
        int *pPointer;

};

#endif


My.cpp

Код

#include "My.h"
#include <iostream>


// consrtuctor
My::My()
{
    pPointer = 0;
    pPointer = new int;

    // ...еще много всего может быть...
}

// destructor
My::~My()
{
    delete pPointer;
    pPointer = 0;
}


void My::setNumber()
{
    *pPointer = 66;
}


void My::getNumber()
{
    std::cout << *pPointer << std::endl;
}


// create pPointer
void My::create()
{
    if(pPointer == 0)
        pPointer = new int;
}


main.cpp

Код

#include "My.h"

int main()
{

    My *myObject = new My;
    myObject->setNumber();
    myObject->getNumber();
    
    myObject->~My();

    myObject->create();
    myObject->setNumber();
    myObject->getNumber();


    return 0;
}

--------------------
I'll be back !
PM MAIL   Вверх
bsa
Дата 24.3.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я и без примеров прекрасно понял о чем речь. Я не понял, ЗАЧЕМ? Назови хоть одну причину, по которой нужно городить такой неочевидный и опасный код? Какова вероятность, что человек не забудет вызывать деструктор перед вызовом create()? И если тебе нужно проинициализировать заново объект, то кто мешает использовать operator= или, если совсем критично по скорости, конструкцию My().swap(myObject)?
PM   Вверх
Modul
Дата 24.3.2011, 17:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Цитата(bsa @  24.3.2011,  16:55 Найти цитируемый пост)
Я не понял, ЗАЧЕМ? 


Это по сабжу, что так можно.


Цитата(bsa @  24.3.2011,  16:55 Найти цитируемый пост)
Назови хоть одну причину, по которой нужно городить такой неочевидный и опасный код? 


Например, удаление (очистка) массы этих переменных.

Ну, дорогой bsa, Вы же сами прекрасный программист.

И степень опасности он же и определяет. Все в его ровных (или кривых) руках.

p.s. Так никогда сам не делал, это к сабжу все.
--------------------
I'll be back !
PM MAIL   Вверх
mes
Дата 24.3.2011, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Modul @  24.3.2011,  16:06 Найти цитируемый пост)
Это по сабжу, что так можно.

хороший пример, как ни в коем случае нельзя делать... 
 smile 

 



--------------------
PM MAIL WWW   Вверх
Modul
Дата 24.3.2011, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



"... а кто знает, тот не говорит" - народная китайская поговорка.


Цитата(mes @  24.3.2011,  20:00 Найти цитируемый пост)
как ни в коем случае нельзя делать... 


Расскажите почему, просим...
--------------------
I'll be back !
PM MAIL   Вверх
mes
Дата 24.3.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Modul @  24.3.2011,  19:46 Найти цитируемый пост)
Расскажите почему, просим... 

главный ответ тут :
Цитата(bsa @  24.3.2011,  15:02 Найти цитируемый пост)
Непосредственный вызов деструктора используется ТОГДА И ТОЛЬКО ТОГДА, когда использовался размещающий new. 


еще нужно вспомнить о правиле хорошего тона, о соблюдении симметрии создания и удаления.. 

ну и как результат в вашем примере будет либо двойной вызов деструктора, либо память не будет освобождена.. 








--------------------
PM MAIL WWW   Вверх
Modul
Дата 24.3.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Цитата(mes @  24.3.2011,  21:22 Найти цитируемый пост)
будет либо двойной вызов деструктора


Т.е. мы один раз удалили при удалении в деструкторе, 
а потом при удалении нашего объекта myObject  еще раз.
--------------------
I'll be back !
PM MAIL   Вверх
mes
Дата 24.3.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Modul @  24.3.2011,  20:42 Найти цитируемый пост)
Т.е. мы один раз удалили при удалении в деструкторе, 
а потом при удалении нашего объекта myObject  еще раз.

один раз  Вы вызвали деструктор вручную,
а второй раз вызовется при выходе за границы пользования (для стекового и статического объектов)
или при вызове delete (для  объекта кучи)

обратите внимание на пример bsa.. память в которой размещается объект имеет тип char -т.е. пустой буфер, при удалении которого никаких деструкторов не надо.. 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 24.3.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Modul @  24.3.2011,  17:06 Найти цитируемый пост)
Это по сабжу, что так можно.

как ТС вставлю своё слово...
вообще-то сабж был не "можно ли это" а 
Цитата(borisbn @  24.3.2011,  10:57 Найти цитируемый пост)
подскажите, пожалуйста, в каких случаях это используется.

Цитата(borisbn @  24.3.2011,  11:58 Найти цитируемый пост)
можете привети примеры, в которых это необходимо (требуется) применять ?

Цитата(borisbn @  24.3.2011,  11:58 Найти цитируемый пост)
Другими словами, что это за случаи, когда нельзя сделать "по-человечески" new/delete ?


Добавлено через 1 минуту и 58 секунд
вообще-то, я уже всё понял, поэтому отвечать на эти три вопроса не нужно smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Modul
Дата 24.3.2011, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Спасибо, borisbn, за Вашу тему !

Поэтому, она позволили не  только Вам найти ответ на Ваш вопрос, 
но и мне и другим людям в сообществе.

А плохо это или хорошо, это решать программисту. Спасибо большое всем !
--------------------
I'll be back !
PM MAIL   Вверх
bsa
Дата 24.3.2011, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Modul @  24.3.2011,  22:06 Найти цитируемый пост)
А плохо это или хорошо, это решать программисту.

К сожалению. С++ позволяет слишком многое, чем "пользуются" недостаточно опытные программисты, не знающие, чем это черевато.
PM   Вверх
mes
Дата 24.3.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Modul @  24.3.2011,  21:06 Найти цитируемый пост)
А плохо это или хорошо, это решать программисту. 

 smile , поэтому существует столько ужасного и опасного кода.. 
хотя и написана куча литературы, о том как сделать приятно и себе и людям.. 
 smile 



--------------------
PM MAIL WWW   Вверх
Modul
Дата 24.3.2011, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Философские мысли:

Как ужасно спится манагеру, который продает ужасную программу г....но клиенту с г...кодом.  smile 

который приходит в 14-15 часов и говорит, 
ну что...клиент убегает,
нас увольняют,
закрывают...

Потом приходит и говорит после 5 мин. базара,  опа, 

А как мы вчера ДУНУЛИ !!!  smile 


Надо спросить Бориса.
--------------------
I'll be back !
PM MAIL   Вверх
borisbn
Дата 24.3.2011, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Modul @  24.3.2011,  23:38 Найти цитируемый пост)
А как мы вчера ДУНУЛИ !!!

верю  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
alexvs11
Дата 24.3.2011, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 6
Всего: 10



первое что приходит в голову - вызов деструктора, чтобы по этому же адресу вызвать явно конструктор

так можно заново проинициализировать объект, при этом все внешние ссылки на этот объект останутся валидными

Это сообщение отредактировал(а) alexvs11 - 24.3.2011, 23:48
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.