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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Меры избежания утечек памяти 
V
    Опции темы
andrew_121
Дата 25.5.2009, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Сабж.

Доброго времени суток!

Банальный вопрос. Но все же...
Как избежать утечек памяти в большом проекте? Что для этого стОит делать, а чего не стОит?
Может все объекты "собственного" производства унаследовать от базового, который в себе переопределит operator new, operator delete, и в нем вести учет выделенной/освобожденной памяти. От утечек это конечно не избавит, но хотя бы можно будет обнаружить это на ранней стадии разработки.

В общем вопрос понятен.

Это сообщение отредактировал(а) andrew_121 - 25.5.2009, 01:25


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 25.5.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как то делал проект, средний по объему.
Никак не мог уловить утечку памяти(видно было по диспетчеру задач).
За 10 секунд в проект была вставлена брутальность в виде:
Код


class mm
{
private:
    size_t alloc;
    size_t freed;
public:
    mm()
    {
        alloc = freed = 0;
    }
    mm~()
    {
        //Пишем отчет в файл
    }
    void* getmem(size_t size)
    {
        alloc+=size;
        return malloc(size);
    }
    void freemem(void * ptr)
    {
        freed += sizeof(ptr);
        free(ptr);
    }
}mm_inst;
#undef malloc
#define malloc mm_inst.getmem
#define free mm_inst.freemem

еще 3 минуты , и утечка была найдена  smile 
В Borland C++ Builder есть хорошая штука - CodeGuard.
Сообщает не только об утечках , но и о других ошибках.
Уверен на все %сто% , что и для других более-менее популярных сред есть аналогичные инструменты!
Еще вспомнилось , в вижуал студии есть встроенная поддержка для контроля утечек памяти.
Надо прописать какие то дефайны. 

Это сообщение отредактировал(а) REZiaMIX - 25.5.2009, 01:17


--------------------
user posted image
PM MAIL   Вверх
andrew_121
Дата 25.5.2009, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



REZiaMIX, C getmem() - Согласен. А с freemem() - Нет!
ГетМем() правильно щитает выделенную память, а ФриМем - нет! Он щитает только размер указателя. Какая польза ??? Даже если указатель разименовать, он будет щитать размер объекта на который указывает. Что-то тут не то...
Да и ваще, мне что в проекте переименовать все operator new, operator delete, и заменить их на методы? Как-то не логично.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
REZiaMIX
Дата 25.5.2009, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм , и в правду , надо порыться в исходниках.
Вот тут чуток для visual c++;

Добавлено @ 01:39
Код


class mm
{
private:
    size_t alloc;
    size_t freed;

public:
    mm()
    {
        alloc = freed = 0;
    }
    void* getmem(size_t size)
    {
        alloc+=size;
        char * ptr = (char*)malloc(size+sizeof(size_t));
        memcpy(ptr,&size,sizeof(size_t));
        ptr+=sizeof(size_t);
        return (void*)ptr;
    }
    void freemem(void * ptr)
    {
        char * ptrc = (char*)ptr;
        size_t len;
        memcpy(&len,ptrc-4,sizeof(size_t));
        freed+= len;
        free(ptrc-4);
    }
}mm_inst;
#undef malloc
#define malloc mm_inst.getmem
#define free mm_inst.freemem


Для смысла будет понятно)

Добавлено @ 01:40
переименовывать в моем случае ничего не надо , #define все сделает сам smile

Это сообщение отредактировал(а) REZiaMIX - 25.5.2009, 01:41


--------------------
user posted image
PM MAIL   Вверх
andrew_121
Дата 25.5.2009, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Rickert
Дата 25.5.2009, 03:58 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

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



Воспользоваться или реализовать самому умные указатели.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
andrew_121
Дата 25.5.2009, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(Rickert @  25.5.2009,  03:58 Найти цитируемый пост)
Воспользоваться или реализовать самому умные указатели.

Да. Спасибо.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 08:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Rickert @  25.5.2009,  03:58 Найти цитируемый пост)
Воспользоваться или реализовать самому умные указатели. 

и это тоже..но в основном ответ на вопрос звучит так - писать правильный кодsmile (как ни странно)
Пример где использование умных указателей не спасет от возможной утечки памяти
Код

myfunction
(
    std::auto_ptr<A>(new A()), std::auto_ptr<A>(new A())
);


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



azesmcar, почему не спасет? запятая ж является точкой следования

andrew_121, переопределять глобальные operator new, operator delete, operator new[], operator delete[]
если в приложении критична скорость, переопределять их с помощью #ifdef

ну и есть куча тулзей, что тебе лики предоставит

Это сообщение отредактировал(а) Alek86 - 25.5.2009, 09:09


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alek86 @  25.5.2009,  09:09 Найти цитируемый пост)
почему не спасет? 

при возникновении исключения в одном из конструкторов - может случится утечка. Например если очередь подстановки параметров функции (которая кстати неопределена по стандарту - а это значит что компилятор волен делать это как его компиляторской душе угодно) будет происходить так

Цитата

1.new A() //конструктор класса А для первого обьекта
2.new A() //конструктор класса А для второго обьекта
3.std::auto_ptr<A> конструктор класса auto_ptr для первого обьекта
4.std::auto_ptr<A> конструктор класса auto_ptr для второго обьекта

если на втором шаге произойдет исключение - будет утечка.
PM   Вверх
Alek86
Дата 25.5.2009, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



Цитата(Rickert @  25.5.2009,  03:58 Найти цитируемый пост)
Воспользоваться или реализовать самому умные указатели.

умные указатели - не панацея

если возможны циклические ссылки, то shared_ptr не поможет
придется добавлять weak_ptr и серьезно проектировать, ибо вики хорошо так добавляют в сложности проги

Добавлено через 2 минуты и 29 секунд
тьфу, это ж обьява функции
кто ж так пишет обьявы, что не заметишь....


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alek86 @  25.5.2009,  09:13 Найти цитируемый пост)

Добавлено через 2 минуты и 29 секунд
тьфу, это ж обьява функции
кто ж так пишет обьявы, что не заметишь.... 

да нет, это вызов функции smile

Добавлено через 48 секунд
Код

foo(std::auto_ptr<A>(new A()), std::auto_ptr<A>(new A()));

так лучше?
PM   Вверх
Alek86
Дата 25.5.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



ага, имхо, намного
совсем не так прочел - слишком стиль от привычного мне отличается smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
azesmcar
Дата 25.5.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(Alek86 @  25.5.2009,  09:23 Найти цитируемый пост)
ага, имхо, намного
совсем не так прочел - слишком стиль от привычного мне отличается smile


строка длинная была smile 
PM   Вверх
sparn
Дата 25.5.2009, 11:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



есть несколько простых правил, придерживаясь которых можно избежать большинства возможных утечек, например: избегать по максимуму ручного выделения и удаления памяти (например использовать контейнеры которые подчистят сами при удалении), удалять память там где выделяешь, написал new напиши сразу delete... Исходя из собственного опыта про умные указатели могу сказать что они не исключают утечек и если уж таковые произошли то процесс выявления и избавиления от них может стать настоящим кошмаром >_<.

для проверки и выявления тяжелых случаев утечек я использовал memory validator.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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