g_hash_table_new () и g_queue_new () - PullRequest
       22

g_hash_table_new () и g_queue_new ()

0 голосов
/ 25 июня 2019

У меня есть такая функция, которая инициализирует глобальную хэш-карту.

GHashTable* globalHT;

init() {
 GQueue* queue = g_queue_new();
 g_hash_table_insert (globalHT,
                     "key",
                     queue);

}

void main() {
   init();
   GQueue* myqueueRef = (GQueue*) g_hash_table_lookup (globalHT, "key");
   // Is myqueueRef valid here?
}

Теперь, когда я вызываю init () внутри main () и затем ссылаюсь на значение ключа, myqueueRef будет NULL или действительным?

Я пытаюсь убедиться, что автоматическая переменная "queue" внутри init () не является локальной и не перестает существовать при возврате init ()

1 Ответ

2 голосов
/ 25 июня 2019

Теперь, когда я вызываю init () внутри main () и затем ссылаюсь на значение ключа, myqueueRef будет NULL или действительным?

Ваша программа потерпит крах, потому что вы не создали globalHT, используя g_hash_table_new_full().

Я пытаюсь убедиться, что автоматическая переменная "queue" внутри init () не является локальной и не перестает существовать при возврате init ()

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

Узнайте о различиях между выделением стека и кучи в C.

...