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

Про утечку памяти, new, delete и функции, возвращающие указатель на структуру

21.03.2018, 00:40. Показов 1416. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
О как тему назвал!
Очередной вопрос от новичка.

Допустим, есть код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <cstdio>
#include <ctime> 
int main () {
    char    string[256];
    time_t  ti;
    struct tm * tmi;
    while (1 > 0) { 
        time (&ti);
        tmi = localtime (&ti);
        sprintf(string, "%d.%.2d.%.2d %.2d:%.2d:%.2d", 1900+tmi->tm_year, tmi->tm_mon, tmi->tm_mday, tmi->tm_hour, tmi->tm_min, tmi->tm_sec);
    }
    return 0;
}
Запускаем, смотрим в системном мониторе: используемая память не растёт - примерно 150кб.
Вариант 2.
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
#include <cstdio>
#include <ctime>
 
time_t yearsec(int);
 
int main () {
    char    string[256];
    time_t  ti;
    struct tm * tmi;
 
    while (1 > 0) {
        ti = yearsec(2017);
        tmi = localtime (&ti);
        sprintf(string, "%d.%.2d.%.2d %.2d:%.2d:%.2d", 1900+tmi->tm_year, tmi->tm_mon, tmi->tm_mday, tmi->tm_hour, tmi->tm_min, tmi->tm_sec);
    }
    return 0;
}
 
time_t yearsec(int y) {
        struct tm *t = new tm ();
        t->tm_mday = 1;
        t->tm_year = y - 1900;
        return mktime(t);
}
Видим утечку.

Предполагается многократный вызов функций типа yearsec. В ней библиотечкая функция, которая возвращает указатель на стандартную структуру типа tm, stat и т.п.
В каких случаях возможна утечка памяти и нужен в каких-нибудь ситуациях delete?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2018, 00:40
Ответы с готовыми решениями:

Вопрос про утечку памяти в Qt
У меня вопрос. В этом коде: #include &lt;QApplication&gt; #include &lt;QFont&gt; #include &lt;QPushButton&gt; #include &lt;QWidget&gt; class...

Про деструктор и утечку памяти
Доброе время суток. Вот что дано: #include &lt;string&gt; #include &lt;vector&gt; class Symbols { protected: void add(std::string...

Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char
Задание: Объявить массив из N указателей на функции, возвращающих указатели на функции, возвращающие указатель на char. Можно...

5
 Аватар для vlisp
1067 / 988 / 153
Регистрация: 10.08.2015
Сообщений: 5,393
21.03.2018, 01:00
new, delete - это скобки, иначе утечка. поэтому использовать только в одном пространстве имен
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
21.03.2018, 09:12
C++
1
2
3
4
5
6
time_t yearsec(int y) {
        struct tm t;
        t.tm_mday = 1;
        t.tm_year = y - 1900;
        return mktime(&t);
}
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,123
21.03.2018, 09:20
Если какая-либо функция возвращает указатель, это не означит, что для возвращаемого значения была выделена динамическая память. Нужно читать документацию к подобной функции, там должны быть указаны особенности её реализации. Например, функция может быть построена как-то так:
C++
1
2
3
4
5
6
struct tm * GetTimePtr()
{
    static struct tm t;
    //...
    return &t;
}}
0
0 / 0 / 0
Регистрация: 04.09.2017
Сообщений: 6
21.03.2018, 21:10  [ТС]
Какая разница между примерам GbaLog и Ygg кроме того, что t из GetTimePtr будет доступна извне функции после её завершения?

Верно ли что при каждом вызове yearsec область памяти, где будет храниться struct tm t, одна и та же, и, теоретически ,после завершения yearsec данные t будут где-то храниться до следующего вызова yearsec?

Или такое происходит только при использовании static?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
22.03.2018, 12:05
Цитата Сообщение от data4344 Посмотреть сообщение
Какая разница между примерам GbaLog и Ygg кроме того, что t из GetTimePtr будет доступна извне функции после её завершения?
мой пример делает то же, что делает ваш пример, только утечки памяти нет.
в случае Ygg придётся ещё mktime вызвать.
Цитата Сообщение от data4344 Посмотреть сообщение
Верно ли что при каждом вызове yearsec область памяти, где будет храниться struct tm t, одна и та же
в вашем примере - нет.
у вас утечка памяти, при каждом вызове выделяется память, указатель на которую по завершению функции благополучно теряется.
Цитата Сообщение от data4344 Посмотреть сообщение
Или такое происходит только при использовании static?
да, хотя, смотря как выделять.
если так: static struct tm * t = new struct tm;, то +- всё ок, ОС грохнет эту память, когда приложение завершится.
а если так: static struct tm * t; t = new tm;, то снова утечка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2018, 12:05
Помогаю со студенческими работами здесь

Указатель на структуру, как параметр функции
Господа программисты! Прошу вашей помощи! Помогите передать функции в качестве аргумента указатель на структуру. Вот что есть: struct...

Передать указатель на структуру в параметре функции
Есть структура struct Test{ BYTE Size; BYTE* Mass; }; На чистом Си нужно передавать указатель на нее в параметре функции,...

Выделение памяти, проверка на утечку памяти
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru