Возвратите выделенную переменную

Если значения в my_map не уникальны:

inv_map = {}
for k, v in my_map.iteritems():
    inv_map[v] = inv_map.get(v, [])
    inv_map[v].append(k)
10
задан ire_and_curses 20 August 2009 в 12:29
поделиться

5 ответов

У вас есть два варианта: во-первых, передать символ * некоторой функции и использовать его вместо выделения в какой-либо функции, или два, освободить возвращаемое значение позже.

Первый вариант:

char *somefunction(char *str, int somearg){

    //some code

    return str;
}

// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);

Второй вариант:

char *somestr = somefunction(123);
// Do something...
free(somestr);

Я лично предлагаю первый вариант, так как немного легче избежать утечки памяти, когда она не выделяется в рамках произвольных функций.

13
ответ дан 3 December 2019 в 17:21
поделиться

Вы освобождаете его, когда закончите с ним. Не существует правила, согласно которому free (), который соответствует malloc (), должен находиться в той же функции.

4
ответ дан 3 December 2019 в 17:21
поделиться

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

2
ответ дан 3 December 2019 в 17:21
поделиться

Если вы намереваетесь вернуть адрес блока, вам не следует free () блок, а вместо этого полагаться на вызывающий код, чтобы освободить () его позже. Это называется последовательной передачей.

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

2
ответ дан 3 December 2019 в 17:21
поделиться

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

2
ответ дан 3 December 2019 в 17:21
поделиться
Другие вопросы по тегам:

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