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

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

17.12.2011, 16:42. Показов 14478. Ответов 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) Поделитесь как вы удаляете указатели. Может есть какие то хитрости?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.12.2011, 16:42
Ответы с готовыми решениями:

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

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

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

12
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.12.2011, 16:46
Цитата Сообщение от 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
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
17.12.2011, 23:19  [ТС]
Цитата Сообщение от 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.12.2011, 23:27
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
э...как все запущено...идите читайте матчасть
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
17.12.2011, 23:28
Тонкий намек
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.12.2011, 23:46
Цитата Сообщение от OrmaJever Посмотреть сообщение
но ведь не всегда указатели появляются от оператора new.
1) Buffer же указатель?
2) hdr тожеу казатель, очищать их так же?
Нда, если ничего не помогло, прочитайте инструкцию...
Не надо их очищать, за вас компилятор сам справится.
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 00:43
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
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
18.12.2011, 18:35  [ТС]
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
OrmaJever
Под мат частью понимается книги. Возьмите книгу и там все будет объяснено и не будете по два дня тратить на один вопрос. За все это время, что вы потратили на вопрос, вы бы могли уже прочитать как минимум одну главу из книги и знать на много больше, чем узнаете, задав 1 вопрос.
Советую книгу Харви М. Дейтел (H. M. Deitel), Пол Дж. Дейтел (P. J. Deitel)
Как программировать на C++
5ое полное издание.
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
18.12.2011, 19:00
Цитата Сообщение от OrmaJever Посмотреть сообщение
и как узнать какой удалять?
всё просто. если используешь функцию уж будь добр прочитай про нее, а там и ясно станет.
а если сам пишешь функцию - так ты и сам знаешь че с ней делать.
Цитата Сообщение от OrmaJever Посмотреть сообщение
Ну и всё таки один вопрос остался открытым, как узнать когда память утекла? Или вы сами то не знаете
иногда никак. можно с помощью нестандартных дополнений.
или узнаешь когда прога вылетит с критической ошибкой)
вывод - писать всё с самого начала правильно.
на каждый new свой delete и всё.
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
19.12.2011, 15:08  [ТС]
Цитата Сообщение от 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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.12.2011, 15:48
Цитата Сообщение от OrmaJever Посмотреть сообщение
Видно в какой строке выделилась память и адрес указателя, затем какие указатели удалились. Это гениально ...
Это забавная игрушка и не более. Представьте, что вы динамически забиваете массив указателей, скажем, на тыщу элементов - и нафиг это светопреставление в консоли?!
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.12.2011, 16:23
Цитата Сообщение от OrmaJever Посмотреть сообщение
Разве вы не знали что можно перегружать операторы new и delete ? Вчера в поисках метода борьбы с утечками нашёл просто божественую весч.
valgrind Вам в руки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2011, 16:23
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru