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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Смартпоинтеры в STL. 
:(
    Опции темы
NightmareZ
Дата 19.3.2010, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


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

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



Цитата(azesmcar @  18.3.2010,  13:28 Найти цитируемый пост)
скорее всего это утечка, так как не вызовется деструктор наследника, но стандарт не гарантирует определенного поведения, при удалении объекта класса, не имеющего виртуального деструктора через указатель базового.


Ну так деструктор вызываться должен для того, чтобы что-то в классе удалить/почистить/закрыть/etc., а у меня же класс пустой.


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
azesmcar
Дата 19.3.2010, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(NightmareZ @  19.3.2010,  03:08 Найти цитируемый пост)
Ну так деструктор вызываться должен для того, чтобы что-то в классе удалить/почистить/закрыть/etc., а у меня же класс пустой. 

Повторяю еще раз, утечка памяти это частный случай реализации.
Цитата(standard)

In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the
static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual
destructor or the behavior is undefined.


PM   Вверх
borisbn
Дата 19.3.2010, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
у меня же класс пустой

а Child1::vf_ptr ?


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


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



 smile 
Цитата(GoldFinch @  18.3.2010,  19:15 Найти цитируемый пост)
JackYF, в следующем году релизнется:

Спасибо за ссылку, но это ещё ничего не значит. Изначально его планировали релизнуть до 2009, и сейчас у них тоже только планы smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Леопольд
Дата 19.3.2010, 15:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  18.3.2010,  11:33 Найти цитируемый пост)
можно сказать он нужен всегда (когда есть виртуальные методы), а тут тем более, иначе в строке
Тут два варианта. Либо открытый виртуальный деструктор, если собираемся уничтожать объект по ссылке/указателю базового класса (интерфейса). Либо защищённый невиртуальный деструктор, он не даст этого сделать.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 19.3.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  19.3.2010,  15:25 Найти цитируемый пост)
Либо защищённый невиртуальный деструктор, он не даст этого сделать. 

 smile 

так что ли?
Код

class A
{
private:
    ~A() {};
};

class B: public A
{
};

так он и этого тоже не позволит
Код

A *t = new A();
delete t;

может речь идет о защищенном наследовании? В таком случае совсем непонятно зачем там нужен полиморфизм.

Это сообщение отредактировал(а) azesmcar - 19.3.2010, 15:38
PM   Вверх
Леопольд
Дата 19.3.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(NightmareZ @  19.3.2010,  03:08 Найти цитируемый пост)
Ну так деструктор вызываться должен для того, чтобы что-то в классе удалить/почистить/закрыть/etc., а у меня же класс пустой. 
В реальном коде он навряд ли будет пуст. В любом случае, при разрушении объекта через указатель на базовый класс деструктор которого не виртуальный, деструктор наследника не будет вызван. Это нехорошо...

Добавлено @ 15:45
Цитата(azesmcar @  19.3.2010,  15:37 Найти цитируемый пост)
так он и этого тоже не позволит
Конечно не позволит. Подразумевалось что базовый класс абстрактный.

Добавлено @ 15:47
Цитата(Леопольд @  19.3.2010,  15:25 Найти цитируемый пост)
по ссылке/указателю базового класса (интерфейса)
Мне удобнее считать абстракный класс интерфейсом. В C# именно так и сделано, насколько я знаю.

Добавлено через 13 минут и 4 секунды
Цитата(azesmcar @  19.3.2010,  15:37 Найти цитируемый пост)
Код

class A
{
private:
    ~A() {};
};

Нет, так:
Код

class A
{
    virtual void foo() const = 0;
protected:
    ~A(){};
};


Это сообщение отредактировал(а) Леопольд - 19.3.2010, 15:48


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 19.3.2010, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  19.3.2010,  15:38 Найти цитируемый пост)
Конечно не позволит. Подразумевалось что базовый класс абстрактный.

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

class A
{
protected:
    ~A() {};
};

class B: public A
{
public:
    ~B() {};
};

int main ()
{
    B *t = new B();
    delete t;
}


Цитата(Леопольд @  19.3.2010,  15:38 Найти цитируемый пост)
Мне удобнее считать абстракный класс интерфейсом. 

не совсем так, на самом деле интерфейс - это класс, который описывает только интерфейс, который нужно реализовать, т.е. имеет одни только чисто виртуальные функции.

Это сообщение отредактировал(а) azesmcar - 19.3.2010, 15:58
PM   Вверх
Леопольд
Дата 19.3.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  19.3.2010,  15:54 Найти цитируемый пост)
вовсе не обязательно чтобы он был абстрактным, можно например так
В таком случае, A::~A() должен быть виртуальным... smile



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 19.3.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  19.3.2010,  15:56 Найти цитируемый пост)
В таком случае, A::~A() должен быть виртуальным... smile

нет, просто опечатка, исправил.
PM   Вверх
Леопольд
Дата 19.3.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  19.3.2010,  15:54 Найти цитируемый пост)
не совсем так, на самом деле интерфейс - это класс, который описывает только интерфейс, который нужно реализовать, т.е. имеет одни только чисто виртуальные функции.
Как правило. Делать одну функцию чистой а остальные обычными я бы не стал. Даже если во многих наследниках придётся писать заглушки... Хотя, если функций больше 10 и нет возможности провести рефакторинг...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 19.3.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  19.3.2010,  16:02 Найти цитируемый пост)
Как правило. Делать одну функцию чистой а остальные обычными я бы не стал. Даже если во многих наследниках придётся писать заглушки... Хотя, если функций больше 10 и нет возможности провести рефакторинг...

т.е. по твоему абстрактные классы не нужны?
PM   Вверх
Леопольд
Дата 19.3.2010, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  19.3.2010,  15:58 Найти цитируемый пост)
нет, просто опечатка, исправил. 
Тогда я не понял что ты имел ввиду. Разверни, будь добр...

Добавлено @ 16:05
Цитата(azesmcar @  19.3.2010,  16:03 Найти цитируемый пост)
т.е. по твоему абстрактные классы не нужны? 
По моему надо стараться избегать помещать данные и не чистые функции в абстрактные классы. По крайней мере мне лично, так проще...

Это сообщение отредактировал(а) Леопольд - 19.3.2010, 16:06


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
azesmcar
Дата 19.3.2010, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Леопольд @  19.3.2010,  16:03 Найти цитируемый пост)
Тогда я не понял что ты имел ввиду. Разверни, будь добр...

да тоже самое, класс, который не инстанцируется, абстрактный он или нет совершенно не важно.
PM   Вверх
Леопольд
Дата 19.3.2010, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(azesmcar @  19.3.2010,  16:06 Найти цитируемый пост)
да тоже самое, класс, который не инстанцируется, абстрактный он или нет совершенно не важно. 
Где это может понадобиться?



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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