Проблема с использованием функции free () - PullRequest
4 голосов
/ 23 июня 2011

У меня есть программа на C, которая часто использует char *str[xx] персонал. Некоторые строки заполняются с помощью оператора присваивания (=) и не нуждаются в освобождении. Но некоторые другие (в том же массиве) заполняются с помощью strdup(), который должен быть освобожден в конце программы:

char * str [10];

ул [я] = "Привет";

ул [к] = strdup ( "привет");

оба строковых указателя ненулевые , и освобождение str [i] естественным образом сгенерирует «ошибку сегмента». Моя проблема в том, что в конце моей программы у меня нет трека, указатель на который указывает на строку, сгенерированную strdup(). Можете ли вы помочь мне, как я могу найти строку, сгенерированную strdup, чтобы я мог освободить их? спасибо

Ответы [ 3 ]

6 голосов
/ 23 июня 2011

К сожалению, нет языковой функции, с помощью которой вы можете (переносимо) отличить указатель, который указывает на динамически распределенную память, от того, который этого не делает.Вы можете просто вручную сохранить список индексов, для которых он был выделен динамически.Или, в качестве альтернативы, выберите ВСЕГДА выделять в куче, если производительность не является большой проблемой.

0 голосов
/ 23 июня 2011

Правильный способ справиться с этим - следить за тем, что было выделено динамически, через malloc() или strdup().

. Чтобы достичь этой цели, вам необходимо провести рефакторинг вашей программы.

0 голосов
/ 23 июня 2011

Возможно, вы могли бы использовать соглашение об именах, чтобы помочь вам вспомнить, что именно:

char *str[10];
char *str_p[10];

str[i]="Hi";

str_p[k]=strdup("hi");

(или использовать структуру с указателем и флагом, который указывает, что этот конкретный указатель был динамически выделен)

...