Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
1

Утечка памяти и delete

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

Author24 — интернет-сервис помощи студентам
Вот накопились вопросы про утечки памяти.
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) Поделитесь как вы удаляете указатели. Может есть какие то хитрости?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2011, 16:42
Ответы с готовыми решениями:

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

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

delete[] *pointer vs. delete pointer и утечка памяти
Здравствуйте! Есть класс "умного" указателя counted_ptr, который удаляет хранящийся в нём T*...

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

12
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.12.2011, 16:46 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 - гугл твой лучший друг
}
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.12.2011, 23:19  [ТС] 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 вопрос, очень важен для дебага.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.12.2011, 23:27 4
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
э...как все запущено...идите читайте матчасть
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
17.12.2011, 23:28 5
Тонкий намек
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2011, 23:46 6
Цитата Сообщение от OrmaJever Посмотреть сообщение
но ведь не всегда указатели появляются от оператора new.
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
Нда, если ничего не помогло, прочитайте инструкцию...
Не надо их очищать, за вас компилятор сам справится.
0
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 00:43 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);
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.12.2011, 18:35  [ТС] 8
OstapBender, Спасибо! Но если одни указатели нужно удалять а другие нет то как их различать?
Например есть некая функция которая возвращает указатель на char
C++
1
2
3
4
5
6
7
char *funct() {
   // может быть так
   char *var = "string";
   // а может быть и так
   char *var = new char[32];
   return var;
}
и как узнать какой удалять?
Цитата Сообщение от Jupiter Посмотреть сообщение
э...как все запущено...идите читайте матчасть
Как думаете если бы я нашёл где это прочитать я бы спрашивал? Может я не так понял то что читал.
Ну и всё таки один вопрос остался открытым, как узнать когда память утекла? Или вы сами то не знаете
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
18.12.2011, 18:40 9
OrmaJever
Под мат частью понимается книги. Возьмите книгу и там все будет объяснено и не будете по два дня тратить на один вопрос. За все это время, что вы потратили на вопрос, вы бы могли уже прочитать как минимум одну главу из книги и знать на много больше, чем узнаете, задав 1 вопрос.
Советую книгу Харви М. Дейтел (H. M. Deitel), Пол Дж. Дейтел (P. J. Deitel)
Как программировать на C++
5ое полное издание.
1
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 19:00 10
Цитата Сообщение от OrmaJever Посмотреть сообщение
и как узнать какой удалять?
всё просто. если используешь функцию уж будь добр прочитай про нее, а там и ясно станет.
а если сам пишешь функцию - так ты и сам знаешь че с ней делать.
Цитата Сообщение от OrmaJever Посмотреть сообщение
Ну и всё таки один вопрос остался открытым, как узнать когда память утекла? Или вы сами то не знаете
иногда никак. можно с помощью нестандартных дополнений.
или узнаешь когда прога вылетит с критической ошибкой)
вывод - писать всё с самого начала правильно.
на каждый new свой delete и всё.
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
19.12.2011, 15:08  [ТС] 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
Видно в какой строке выделилась память и адрес указателя, затем какие указатели удалились. Это гениально ...
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.12.2011, 15:48 12
Цитата Сообщение от OrmaJever Посмотреть сообщение
Видно в какой строке выделилась память и адрес указателя, затем какие указатели удалились. Это гениально ...
Это забавная игрушка и не более. Представьте, что вы динамически забиваете массив указателей, скажем, на тыщу элементов - и нафиг это светопреставление в консоли?!
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
19.12.2011, 16:23 13
Цитата Сообщение от OrmaJever Посмотреть сообщение
Разве вы не знали что можно перегружать операторы new и delete ? Вчера в поисках метода борьбы с утечками нашёл просто божественую весч.
valgrind Вам в руки.
0
19.12.2011, 16:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2011, 16:23
Помогаю со студенческими работами здесь

Утечка памяти?
Добрый день, форумчане! Я пишу парсер для своего языка программирования и начал с парсинга...

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

Утечка памяти
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;ArrayOperation.h&quot; using namespace std; ...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru