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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> auto_ptr, утечка памяти 
:(
    Опции темы
Alexeis
Дата 29.6.2009, 11:58 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(lv151 @  29.6.2009,  09:46 Найти цитируемый пост)
auto_ptr советует использовать Брюс Эккель.
И вобще, смысл пихать в stl auto_ptr если он лажа?

  Использовать везде и всегда будет неправильным. Это всего одна из стратегий владения, когда один владеет, он же и уничтожает, при этом владелец должен уничтожаться последним. auto_ptr удобен при передаче объекта как посылки, как сообщения другому объекту. Т.е. передал объект вместе с правами владения или вернул из функции с правами владения. Он не годиться в случае если время жизни объекта заранее не определено и имеются несколько ссылок на него. При использовании auto_ptr "просто так", всегда есть шанс что сделаешь прямое присвоение объектов и потеряешь экземпляр. 
  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
lv151
Дата 29.6.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проблема вот в чём.

Код

class MyClass
{
private:
    IInterface1* in1;
    IInterface2* in2;
public:
    MyClass1()
    {
          in1 = new MyClass1;
          in2= new MyClass2;
    }

    ~MyClass1()
    {
          delete in1;
          delete in2;
    }

}


Удаляются только указатели на функции, но адреса in1, in2 нет.

PM MAIL   Вверх
azesmcar
Дата 29.6.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(lv151 @  29.6.2009,  16:29 Найти цитируемый пост)
Удаляются только указатели на функции, но адреса in1, in2 нет.

Может быть утечка памяти по причине того, что деструктор в классах IInterface2 и IInterface1 невиртуальные (так как обьекты удаляются по указателю базового класса).
PM   Вверх
Lazin
Дата 29.6.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



еще здесь есть неявно созданные конструктор копирования и оператор присваивания, при вызове которых произойдет утечка памяти
PM MAIL Skype GTalk   Вверх
Леопольд
Дата 29.6.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(lv151 @ 29.6.2009,  10:46)
auto_ptr советует использовать Брюс Эккель.
И вобще, смысл пихать в stl auto_ptr если он лажа?

Обратная совместимость. Нельзя что-то просто убрать из STL если это уже там есть. Кстати, книжку он в каком году написал? smile

И я не говорил что он лажа. Просто при работе с ним надо быть осторожным, а где-то он наверняка может оказаться полезным, ну а в STL контейнерах его просто нельзя использовать. Со scoped_ptr/_array не надо быть таким осторожным. shared_ptr идеально подходит для STL контейнеров... Их наверняка можно использовать криво, правда для этого уже надо будет извратиться... скорее всего smile Я не хочу над этим раздумывать, пустая трата времени, но сходу придумать, как их подломать, не могу.

Добавлено @ 17:27
Цитата(Lazin @ 29.6.2009,  16:37)
еще здесь есть неявно созданные конструктор копирования и оператор присваивания, при вызове которых произойдет утечка памяти

Здесь не только утечка, ещё и undefined behaviour может быть из-за MyClass::MyClass(const MyClass&); и MyClass& MyClass::operator= (const MyClass&); Например, при передаче по значению как аргумент функции, память (видимо частично) будет освобождена, после смерти этой копии. Потом она будет освобождена ещё ровно столько раз, сколько копий объекта было создано.

А на вопрос (27.6.2009, 21:19) так и нет ответа, к сожалению. 

Это сообщение отредактировал(а) Леопольд - 29.6.2009, 17:51


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


Опытный
**


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

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



Цитата(lv151 @ 29.6.2009,  16:29)
Проблема вот в чём.
...

Для того чтобы понять в чём ещё проблема, кроме не объявленного оператора присваивания и конструктора копирования по умолчанию, надо посмотреть на объявления IInterface1 и IInterface2

Добавлено @ 17:47
Цитата(Леопольд @ 29.6.2009,  17:15)
Их наверняка можно использовать криво, правда для этого уже надо будет извратиться... скорее всего smile Я не хочу над этим раздумывать, пустая трата времени, но сходу придумать, как их подломать, не могу.

Я случайно придумал!!! smile
Код

Class* lptr = new Class;
boost::shared_ptr<Class> ptr(lptr);
delete lptr;

Не каждый додумается так непреднамеренно ошибиться. Если только с очень большого бодуна. А если не пьёт, то шансы почти нулевые smile

Это сообщение отредактировал(а) Леопольд - 29.6.2009, 17:55


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Леопольд @  29.6.2009,  16:36 Найти цитируемый пост)
Я случайно придумал!!!

А еще можно явно вызвать деструктор статического или временного объекта smile
Собственно для того и придумали чтобы можно было писать так
Код

boost::shared_ptr<Class> ptr(new Class);

Зачем иметь 2е переменные в одной области видимости? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Леопольд
Дата 29.6.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не смог успокоится и придумал простейший сборщик мусора. Вроде неплохо получилось. Критика приветсвуется! Но пожалуйста, без грубости, помягче... smile
Код
moved


Создал отдельную тему http://forum.vingrad.ru/forum/act-ST/f-92/...2/unread-1.html

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


--------------------
вопросов больше чем ответов
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.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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