Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

Утечка памяти и delete - C++

17.12.2011, 16:42. Просмотров 1853. Ответов 12
Метки нет (Все метки)

Вот накопились вопросы про утечки памяти.
1) Как проявляется утечка памяти? На многих сайтах написано что если не удалять указатели то память будет утекать, но как узнать что она утекла? Как боротся с тем чего не знаешь? Как я себе это понимаю: у меня есть цикличная программа которая выполняет некоторые действия и возвращается на первоначальную точку, ждём сигнала и потом снова что-то делает, и вот после каждого цыкла у меня память по чуть чуть увеличивается. Это и есть утечка?
2) Например уменя есть та же цыклическая программа
C++
1
2
3
4
5
6
7
8
char *str;
 
while(true) {
// ...
str = "asd";
//delete str ?
}
// или тут delete str ?
Нужно ли в таком коде в конце каждого цыкла применять delete к str? А если обьявление в цыкле?
C++
1
2
3
4
5
6
while(true) {
// ...
char *str;
str = "asd";
// delete str ?
}
3) Интересует оператор delete[]. Прочитал на хабре что оператор delete[] выполняется так же только вызывает деструкторы для всех класов (а delete только для первого). Дак стоит для для масива char'ов или int'ов применять delete[] ?
C++
1
2
3
4
char *str = new char[32];
// delete str;
// or
// delete[] str;
4) Поделитесь как вы удаляете указатели. Может есть какие то хитрости?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.12.2011, 16:42     Утечка памяти и delete
Посмотрите здесь:

Delete[] и утечка памяти - C++
Как можно избежать вытока памяти? И вообще почкму криво работает? #include<iostream> #include<windows.h> #include<ctime> using...

Утечка памяти. new/delete. Всё как доктор прописал, но не работает - C++
Всем привет! Начну сразу с кода: #include "stdafx.h" #include <conio.h> #include <iostream> using namespace std; class...

Утечка памяти - C++
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель ...

Утечка памяти - C++
Помогите с кодом, вот написал реализацию стека по заданию. Преподаватель попросил проверить, верно ли я использую delete, ибо mas в классе...

Утечка памяти - C++
Доброго времени суток, форумчане. Помогите справиться с утечкой памяти, не понятно где зараза засела. Это класс представления числа в СОК...

Утечка памяти - C++
Привет! написал программму, и не могу разобраться где утекает память. помогите кто сможет. Задание #include <iostream> ...

Утечка памяти? - C++
В Лафоре такой код: #include <iostream> using namespace std; /////////////////////////////////////////////////////////// class...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.12.2011, 16:46     Утечка памяти и delete #2
Цитата Сообщение от OrmaJever Посмотреть сообщение
Поделитесь как вы удаляете указатели. Может есть какие то хитрости?
используем смарт указатели, контейнеры

Цитата Сообщение от OrmaJever Посмотреть сообщение
3) Интересует оператор delete[]. Прочитал на хабре что оператор delete[] выполняется так же только вызывает деструкторы для всех класов (а delete только для первого). Дак стоит для для масива char'ов или int'ов применять delete[] ?
используй правило:
на каждый new должен быть свой delete
на каждый new [] должен быть свой delete []

примеры:
C++
1
2
3
4
5
6
7
char* s;
while (true)
{
    s = new char[20];
//...
}
delete [] s; //утечка - удалится только память выделенная последним new[]
C++
1
2
3
4
5
6
7
char* s;
while (true)
{
    s = new char[20];
//...
    delete s; //undefined behaviour - гугл твой лучший друг
}
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.12.2011, 23:19  [ТС]     Утечка памяти и delete #3
Цитата Сообщение от Jupiter Посмотреть сообщение
используй правило:
на каждый new должен быть свой delete
на каждый new [] должен быть свой delete []
но ведь не всегда указатели появляются от оператора new. Например
C++
1
2
3
4
5
6
7
8
9
10
char Buffer[128];
 
typedef struct IPHeader {
    char *a;
    int b;
} *MyStruct;
...
recv( s, Buffer, sizeof(Buffer), 0 );
...
MyStruct hdr = (MyStruct)Buffer;
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?

А примеры я не очень понял, мне интересно как правельно писать, а не как не нужно.
Ещё очень хотелось бы услышать ответ на 1 вопрос, очень важен для дебага.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.12.2011, 23:27     Утечка памяти и delete #4
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
э...как все запущено...идите читайте матчасть
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.12.2011, 23:28     Утечка памяти и delete #5
Тонкий намек
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
17.12.2011, 23:46     Утечка памяти и delete #6
Цитата Сообщение от OrmaJever Посмотреть сообщение
но ведь не всегда указатели появляются от оператора new.
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
Нда, если ничего не помогло, прочитайте инструкцию...
Не надо их очищать, за вас компилятор сам справится.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 00:43     Утечка памяти и delete #7
OrmaJever, не всякий указатель нужно подчищать.
очищать нужно только ту память, что была выделена динамически на КУЧЕ ( с помощью new, malloc).
также некоторые функции могут без нашего ведома выделять память и возвращать на нее указатель,в таком случае можно тоже очистить. ex. strdup.
C
1
2
3
4
5
6
7
    char b[100]="HAI";
 
    char * p = strdup(b);
 
    puts(p);
 
    free(p);
а попробуй так сделать, и увидишь:
C
1
2
3
char b[100] = "123";
char * p = b;
free(p);
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.12.2011, 18:35  [ТС]     Утечка памяти и delete #8
OstapBender, Спасибо! Но если одни указатели нужно удалять а другие нет то как их различать?
Например есть некая функция которая возвращает указатель на char
C++
1
2
3
4
5
6
7
char *funct() {
   // может быть так
   char *var = "string";
   // а может быть и так
   char *var = new char[32];
   return var;
}
и как узнать какой удалять?
Цитата Сообщение от Jupiter Посмотреть сообщение
э...как все запущено...идите читайте матчасть
Как думаете если бы я нашёл где это прочитать я бы спрашивал? Может я не так понял то что читал.
Ну и всё таки один вопрос остался открытым, как узнать когда память утекла? Или вы сами то не знаете
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
18.12.2011, 18:40     Утечка памяти и delete #9
OrmaJever
Под мат частью понимается книги. Возьмите книгу и там все будет объяснено и не будете по два дня тратить на один вопрос. За все это время, что вы потратили на вопрос, вы бы могли уже прочитать как минимум одну главу из книги и знать на много больше, чем узнаете, задав 1 вопрос.
Советую книгу Харви М. Дейтел (H. M. Deitel), Пол Дж. Дейтел (P. J. Deitel)
Как программировать на C++
5ое полное издание.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 19:00     Утечка памяти и delete #10
Цитата Сообщение от OrmaJever Посмотреть сообщение
и как узнать какой удалять?
всё просто. если используешь функцию уж будь добр прочитай про нее, а там и ясно станет.
а если сам пишешь функцию - так ты и сам знаешь че с ней делать.
Цитата Сообщение от OrmaJever Посмотреть сообщение
Ну и всё таки один вопрос остался открытым, как узнать когда память утекла? Или вы сами то не знаете
иногда никак. можно с помощью нестандартных дополнений.
или узнаешь когда прога вылетит с критической ошибкой)
вывод - писать всё с самого начала правильно.
на каждый new свой delete и всё.
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
19.12.2011, 15:08  [ТС]     Утечка памяти и delete #11
Цитата Сообщение от OrmaJever Посмотреть сообщение
Может есть какие то хитрости?
А хитрость то есть. Разве вы не знали что можно перегружать операторы new и delete ? Вчера в поисках метода борьбы с утечками нашёл просто божественую весч.
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
32
33
34
35
36
37
38
39
40
41
#include <windows.h>
 
#ifdef _DEBUG
#include <iostream.h>
 
inline void * __cdecl operator new[](unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    cout << "Memory size of " << size << " bytes allocated to array p(" << ptr << ") in " << file << ":" << line << endl;
    return ptr;
};
 
inline void * __cdecl operator new(unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    cout << "Memory size of " << size << " bytes allocated p(" << ptr << ") in " << file << ":" << line << endl;
    return ptr;
};
 
inline void __cdecl operator delete(void *p)
{
    cout << "Memory is deleted p(" << p << ")" << endl;
    free(p);
};
inline void __cdecl operator delete[](void *p)
{
    cout << "Memory is deleted from array p(" << p << ")" << endl;
    free(p);
 
};
#endif
 
#ifdef _DEBUG
    #define DEBUG_NEW new(__FILE__, __LINE__)
#else
    #define DEBUG_NEW new
#endif
 
#define new DEBUG_NEW
 
#endif
Видно в какой строке выделилась память и адрес указателя, затем какие указатели удалились. Это гениально ...
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
19.12.2011, 15:48     Утечка памяти и delete #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
Видно в какой строке выделилась память и адрес указателя, затем какие указатели удалились. Это гениально ...
Это забавная игрушка и не более. Представьте, что вы динамически забиваете массив указателей, скажем, на тыщу элементов - и нафиг это светопреставление в консоли?!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 16:23     Утечка памяти и delete
Еще ссылки по теме:

Утечка памяти - C++
Здравствуйте. Есть программа (разбитая на функции) постоянно работающая в цикле и выводящая информацию на консоль. И получается что она...

утечка памяти - C++
если запустить код char *pointer = NULL; for( int i = 0; i &lt; 10; i++ ) { pointer = new char; } delete pointer; , то есть...

Утечка памяти - C++
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable; дополняю его таким образом ...

Утечка памяти в - C++
Кто подскажет плиз. Тут у меня утечка памяти foreach (var file in xpsFiles) { ...

Утечка памяти - C++
В небольшой программе с использованием OpenCV происходит утечка памяти, с чем связана не понимаю, прошу помощи, спасибо! #include...


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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
19.12.2011, 16:23     Утечка памяти и delete #13
Цитата Сообщение от OrmaJever Посмотреть сообщение
Разве вы не знали что можно перегружать операторы new и delete ? Вчера в поисках метода борьбы с утечками нашёл просто божественую весч.
valgrind Вам в руки.
Yandex
Объявления
19.12.2011, 16:23     Утечка памяти и delete
Ответ Создать тему
Опции темы

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