Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
304 / 157 / 11
Регистрация: 07.06.2009
Сообщений: 538
1

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

09.06.2009, 19:32. Просмотров 926. Ответов 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[], или я идиот?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2009, 19:32
Ответы с готовыми решениями:

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

Выделение памяти под массив в классе. Почему не могу правильно выделить?
Все привет! не могу понять почему в классе не получается выделить память из стека для массива....

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

Очистка памяти с delete[]
Нужно очистить память перед закрытием программы. Но не могу этого сделать выдает Exception thrown...

8
Заказ софта
342 / 187 / 21
Регистрация: 26.05.2009
Сообщений: 863
09.06.2009, 19:41 2
Майкрософт всегда прав... =)
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
09.06.2009, 19:44 3
нужо. только не delete[] а free

почему
ненавязчивый намёк юзать безопасные (_s) версии функций? :gigi:
1
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
09.06.2009, 21:48 4
Цитата Сообщение от exe-dealer Посмотреть сообщение
.... нужно ведь сохранить указатель на сторку, которую вернула asctime и после использования удалить через delete[], или я идиот?
А MSDN почитать?
"asctime uses a single, statically allocated buffer to hold the return string."
Так что delete[], равно как и free, приведут всего лишь к UB.
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
09.06.2009, 22:03 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.
1
304 / 157 / 11
Регистрация: 07.06.2009
Сообщений: 538
09.06.2009, 22:09  [ТС] 6
вот и я запутался, вроде бы когда натравливаешь delete на статический или автоматический масив, то access voulation, а там все вроде бы удаляется без ошибок.
зы А насчет free теперь буду знать, я думал там с++, (неделю как с++ учу, совсем новичок)
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.06.2009, 00:16 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 нетрудно видеть.
От оно как......
0
MCSD: APP BUILDER
8787 / 1065 / 104
Регистрация: 17.06.2006
Сообщений: 12,604
10.06.2009, 12:08 8
CheshireCat,
мдэ, неправ был насчет asctime... провел прямую аналогию с strdup..
попытка обмануть ms провалилась (Ж
впрочем, если бы мне нужно было получить строку, я бы все равно юзал бы *_s, куда подается "честный" буфер (:
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
10.06.2009, 13:05 9
И получил бы непереносимый (жестко привязанный к компилятору от M$) код......
Вот за что я не люблю M$ - так это за подобные жульнические проделки и "усовершенствования".
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2009, 13:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Очистка памяти delete[];
Есть функция ввида: void loltest(int md3) { char* randChars; int cCount; ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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