2013-03-20 3 views
1

Давайте предположим, что у меня есть следующий код C:Необходимо освободить память, используемую для возвращаемых переменных из функций (C)?

void myfunction() { 
    time_t  t = 0; 
    struct tm *ct; 

    time(&t); 
    ct = localtime(&t); 
} 

Как вы можете видеть, функция localtime возвращает новый указатель на struct tm переменной. Из того, что я знаю, для возвращаемой переменной из функции, чтобы быть действительным в контексте вызывающего абонента он должен выполнить по крайней мере одно из следующих действий:

  1. Возвращенный переменная должна быть объявлена ​​в контексте вызывающего абонента или выше контекст связанные с абонентом.
  2. Возвращаемая переменная должна иметь выделенную память в куче.

В моем случае первый пункт не применяется, поэтому нормально думать, что 2-й выполняется.

Я прав?

Если да, значит ли это, что мне нужно позвонить бесплатно по переменной ct после ее использования?

Если нет, можете ли вы немного детализировать?

Спасибо!


EDIT:

Из ответов, я понял, что должен быть еще один пункт в требованиях, что переменная, который будет использоваться в условиях, когда вернулся. Это должны быть статические переменные. Есть ли другая возможность?

+3

Это зависит. Вы читаете документацию, а затем, ну, вы узнаете. Чаще всего нет. –

+1

Другие возможности несколько более неясны, но файлы с отображением памяти не являются, строго говоря, выделенными из кучи, но все еще доступны. Кроме того, во встроенном мире могут быть адреса памяти, соответствующие физическому оборудованию. – rra

ответ

2

Несколько старых функций C возвращают указатели на статические буферы. localtime - один из тех. Вам не нужно (и в самом деле не следует, вы, вероятно, segfault ваша программа, если вы это сделаете) освободите возвращенный указатель от localtime.

Проблема заключается в том, что в пространстве процессов есть один и только один буфер localtime, а следующий вызов localtime (даже в другом потоке) перезапишет ранее возвращенные результаты. Вот почему почти все функции, которые ведут себя таким образом (strtok - еще один пример), теперь имеют новые версии _r, которые помещают свои результаты в буфер, переданный пользователем, и поэтому являются потокобезопасными.

1

Нет, вам не нужно, чтобы освободить его:

Возвращенный значение указывает на внутренний объект, действительность или значение может быть изменено любым последующим вызовом gmtime или МестноеВремя.

Source

Другими словами, если вы хотите сохранить возвращаемое значение этой функции, вы должны вручную сохранить его в другом месте.

1

дословные из man localtime на Linux:

Четыре функции asctime(), CTime(), gmtime() и LocalTime() возвращает указатель на статические данные и, следовательно, не являются поточно-безопасным.

Таким образом, нет необходимости освобождать значение, возвращаемое localtime(), и даже больше вы даже не пытаетесь его освободить.

OT: Для того, чтобы остаться поточно-страницы человека гласит:

поточно-версии asctime_r(), ctime_r(), gmtime_r() и localtime_r() определяются SUSv2 и доступен с libc 5.2.5.

+0

Если я называю 'localtime_r' вместо' localtime', значит ли это, что мне нужно вызывать 'free' на возвращаемое значение, когда больше не нужно? – artaxerxe

+0

@artaxerxe С 'struct tm * localtime_r (const time_t * timep, struct tm * result);' возвращаемое значение указывает на буфер, предоставленный вызывающим в качестве дополнительного второго параметра. Поэтому, если требуется «free»(), результат зависит от того, как был выделен буфер. – alk

+0

Прошу прощения. Отсутствие документации. Спасибо за терпение. :) – artaxerxe

Смежные вопросы