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

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

Войти
Регистрация
Восстановить пароль
 
exe-dealer
301 / 154 / 4
Регистрация: 07.06.2009
Сообщений: 538
#1

почему не delete (выделение памяти) - C++

09.06.2009, 19:32. Просмотров 798. Ответов 8
Метки нет (Все метки)

почему в примерах в мсдне не высвобождается память после использования asctime, ctime?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <time.h>
#include <stdio.h>
 
int main( void )
{
    struct tm   *newTime;
    time_t      szClock;
 
    // Get time in seconds
    time( &szClock );
 
    // Convert time to struct tm form 
    newTime = localtime( &szClock );
 
    // Print local time as a string.
    printf_s( "Current date and time: %s", asctime( newTime ) ); // C4996
    // Note: asctime is deprecated; consider using asctime_s instead
}
нужно ведь сохранить указатель на сторку, которую вернула asctime и после использования удалить через delete[], или я идиот?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2009, 19:32     почему не delete (выделение памяти)
Посмотрите здесь:

Динамическое выделение памяти под массив структур (new/delete) - C++
Люди добрые, подскажите пожалуйста, где в моем коде закралась ошибка? Интернет перечитал, во всех примерах код, подобный моему работает, а...

Выделение памяти под массив в классе. Почему не могу правильно выделить? - C++
Все привет! не могу понять почему в классе не получается выделить память из стека для массива. Есть класс: Надо чтоб конструктор класса...

Утечка памяти и delete - C++
Вот накопились вопросы про утечки памяти. 1) Как проявляется утечка памяти? На многих сайтах написано что если не удалять указатели то...

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

Освобождение памяти delete - C++
Если у меня есть указатель (pt) N-ой степени, я присвоил ему указатель на начало массива (N - 1)ой степени (через new), затем некоторому...

Очистка памяти delete[]; - C++
Есть функция ввида: void loltest(int md3) { char* randChars; int cCount; if(md3 &lt;= 0) cCount = 13; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
09.06.2009, 19:41     почему не delete (выделение памяти) #2
Майкрософт всегда прав... =)
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 19:44     почему не delete (выделение памяти) #3
нужо. только не delete[] а free

почему
ненавязчивый намёк юзать безопасные (_s) версии функций? :gigi:
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
09.06.2009, 21:48     почему не delete (выделение памяти) #4
Цитата Сообщение от exe-dealer Посмотреть сообщение
.... нужно ведь сохранить указатель на сторку, которую вернула asctime и после использования удалить через delete[], или я идиот?
А MSDN почитать?
"asctime uses a single, statically allocated buffer to hold the return string."
Так что delete[], равно как и free, приведут всего лишь к UB.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
09.06.2009, 22:03     почему не delete (выделение памяти) #5
asctime uses a single, statically allocated
практика показывает расхождение с теорией
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
_TSCHAR * __cdecl _tasctime (
    REG1 const struct tm *tb
    )
{
    REG2 _TSCHAR *p = buf;
    errno_t e = 0;
 
    _TSCHAR *retval;            /* holds retval pointer */
    _ptiddata ptd = _getptd_noexit();
 
    /* Use per thread buffer area (malloc space, if necessary) */
    if (ptd) {
#ifdef _UNICODE
        if ( (ptd->_wasctimebuf != NULL) || ((ptd->_wasctimebuf =
            (wchar_t *)_calloc_crt(_ASCBUFSIZE, sizeof(wchar_t))) != NULL) )
            p = ptd->_wasctimebuf;
#else  /* _UNICODE */
        if ( (ptd->_asctimebuf != NULL) || ((ptd->_asctimebuf =
            (char *)_calloc_crt(_ASCBUFSIZE, sizeof(char))) != NULL) )
            p = ptd->_asctimebuf;
#endif  /* _UNICODE */
    }
 
    retval = p;         /* save return value for later */
 
 
    e = _tasctime_s( p, _ASCBUFSIZE, tb );
    if ( e != 0 )
    {
        return NULL;
    }
 
    return (retval);
}
single-то он single, но совсем не statically, а очень даже dynamically.
exe-dealer
301 / 154 / 4
Регистрация: 07.06.2009
Сообщений: 538
09.06.2009, 22:09  [ТС]     почему не delete (выделение памяти) #6
вот и я запутался, вроде бы когда натравливаешь delete на статический или автоматический масив, то access voulation, а там все вроде бы удаляется без ошибок.
зы А насчет free теперь буду знать, я думал там с++, (неделю как с++ учу, совсем новичок)
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
10.06.2009, 00:16     почему не delete (выделение памяти) #7
Rififi, я - не согласен с твоими аргументами.... С точки зрения прикладного программиста (а не разработчика CRT библиотеки!) он (буфер) - вполне себе статический. Прикладной программист не выделяет его - и поэтому не должен никогда пытаться освободить, если нет на то явных указаний от разработчиков CRT в мануале (а их - нет!). Где и как освобождаетcя эта память - знают разработчики CRT (ну и мы, конечно, но нам туды лезть шустрыми шаловливыми ручонками запрещено )
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
_CRTIMP void
WINAPI _freefls (
    void *data
    )
{
    /*
     * Free up the _tiddata structure & its malloc-ed buffers.
     */
// ....................
        if(ptd->_asctimebuf)
            _free_crt((void *)ptd->_asctimebuf);
// ....................
}
А эта самая замечательная функция автоматически вызывается для каждого потока при его завершении и "подчищает" за ним. Последствия неуместного пользовательского free нетрудно видеть.
От оно как......
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
10.06.2009, 12:08     почему не delete (выделение памяти) #8
CheshireCat,
мдэ, неправ был насчет asctime... провел прямую аналогию с strdup..
попытка обмануть ms провалилась (Ж
впрочем, если бы мне нужно было получить строку, я бы все равно юзал бы *_s, куда подается "честный" буфер (:
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2009, 13:05     почему не delete (выделение памяти)
Еще ссылки по теме:

delete[] статической памяти - C++
1. Должна ли возникать ошибка (или падение программы) при применении delete к статической памяти? У меня (Microsoft Visual Studio 2005)...

Сколько памяти освобождает delete - C++
История такая, перегрузил операторы new и delete. Теперь хочу отслеживать сколько память выделено и сколько освобождено. С выделением,...

Проверка освобождения памяти (new, delete) - C++
Всем привет. Программы помаленьку становятся сложнее. Появляются самодельные контейнеры внутри других самодельных контейнеров внутри...

new и delete при освобождении памяти - C++
Здравствуйте. Скажите, пожалуйста что я неправильно делаю. При освобождении памяти. Выделяем память: char **VIRTUAL = NULL; if...


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

Или воспользуйтесь поиском по форуму:
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
10.06.2009, 13:05     почему не delete (выделение памяти) #9
И получил бы непереносимый (жестко привязанный к компилятору от M$) код......
Вот за что я не люблю M$ - так это за подобные жульнические проделки и "усовершенствования".
Yandex
Объявления
10.06.2009, 13:05     почему не delete (выделение памяти)
Ответ Создать тему
Опции темы

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