Когда освобожден указатель C возвращенный функцией системы

Я реализую маленькие доказательства призывов к API системы в Linux и у меня есть следующее сомнение.

Я звоню в функцию ctime (). Согласно учебнику ctime, эта функция возвращает указатель в char.

Код составляет и функционирует и этот:

time_t seg = time(NULL);

char* cad = ctime(&seg);

printf("Fecha: %s\n", cad);

Мое сомнение, - если я должен звонить в free () с указателем, возвращенным из-за ctime. Я это попробовал и он дает мне ошибку в выполнении недействительного указателя. Мой вопрос: Кто берется за то, чтобы освобождать действительно память, указанную этим указателем? Я попробовал искать из-за Интернета, но он у меня не остался очень ясным. Спасибо.

3
задан 22.01.2017, 01:39
0 ответов

Страницы учебника ctime:

The return оцените points to в statically allocated string which might be overwritten by subsequent calls to any of the восходите and украдите functions.

А именно, ты не должен освобождать ее. Возвращенный указатель указывает на внутренний буфер системы, и он будет sobreescrito из-за призывов, следующих за той же самой ctime( ).

Если ты захочешь сохранить эту стоимость, ты будешь должен копировать это в твой собственный буфер, используя, например:

char *ret = ctime( ... );
char *myBuff = (char *)malloc( strlen( ret ) + 1 );

*myBuff = 0;
strcat( myBuff, ret );

Этот тип функций они могут давать проблемы, если они использованы с многообразных трэдов, и обычно имеют Ваш эквивалент, с опорой я мультипряду. В случае ctime( ), Ваш эквивалент ctime_r( ).

Относительно кого он освобождает эту память, ответ простой: никто; гипотетическое осуществление ctime( ) оно было бы нечто похожим:

char *ctime( const time_t *timep ) {
  static char CTimeBuffer[1024]; // Tamaño máximo necesario.

  *CTimeBuffer = 0; // Limpiamos el buffer.

  ...
  ... // Código real de la función.
  ...

  return CTimeBuffer; // Devolvemos un puntero al buffer;
}

Как видно, CTimeBuffer будь объявлена как static, что ни способствует тому, чтобы он был доступен в течение всей жизни программы, не будучи необходим размещать память, также ни освобождать ее. Он будет освобожден, рядом с оставшейся частью использованных ресурсов, когда он закончит программу.

5
ответ дан 03.12.2019, 17:35
  • 1
    Большое спасибо, сейчас уже я это понимаю. –  21.01.2017, 22:50
  • 2
    @ycesar, если этот ответ ayudó чтобы решать проблему твоего вопроса, пожалуйста считай принимать кликая в вњ” пёЏ , что está под стрелами votació n, слева от ответа (на тебя не делает скидку ничто поэтому - все противоположность, оба благодетельствуют ). –  22.01.2017, 09:49

Тебе не надо.

Согласно документации (http://www.cplusplus.com/reference/ctime/ctime/), указатель, возвращенный из-за ctime указывает на array, свойственный книжному магазину, а следовательно тебе не надо освобождать это. То, что они не гарантируют тебе, состоит в том, чтобы результат поддержал, если ты звонишь в другие функции книжного магазина. В других функциях ситуация может отличаться, а следовательно он всегда заканчивает тем, что консультирует хорошо документацию.

2
ответ дан 03.12.2019, 17:35

Теги

Похожие вопросы