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

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

21.03.2018, 00:40. Показов 1349. Ответов 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
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
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
2734 / 888 / 331
Регистрация: 10.02.2018
Сообщений: 2,099
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
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru