Я бы хотел использовать эту обертку, но проблема в том, что я пока не знаю, насколько она безопасна.
У меня есть несколько простых вопросов по поводу использования malloc()
, calloc()
,и realloc()
.Вот что у меня есть:
string.h
typedef struct str str; // pointer for encapsulation
string.c
struct str
{
char *buf;
size_t len;
}
Скажем, у меня есть вспомогательная функция, которая просто делает это:
str *NEW_STRING()
{
str *temp = calloc(1, sizeof (struct str));
temp->len = 0;
temp->buf = (char *) malloc(1);
return temp;
}
Это безопасно?Если это так, что произойдет, если я сделаю что-то вроде этого:
str *A_STRING = NEW_STRING();
A_STRING = NEW_STRING();
Это вызвало бы malloc и calloc дважды, это плохо?Будет ли инициализатор лучше?
void str_init(str *A_STRING)
{
if (A_STRING)
{
free(A_STRING);
}
if (A_STRING->buf)
{
free(A_STRING->buf);
}
A_STRING = calloc(1, sizeof (struct str));
A_STRING->buf = (char *) malloc(1);
A_STRING->len = 0;
}
Наконец, это хороший способ освободить память?
void free_string(str *A_STRING)
{
if (A_STRING->buf)
{
free(A_STRING->buf);
}
else
{
A_STRING->buf = NULL;
}
if (A_STRING)
{
free(A_STRING);
}
else
{
A_STRING = NULL;
}
A_STRING->len = 0;
}
Любая дополнительная информация будет полезна, если она будет включена.Я не хочу ничего публиковать, как если бы это была хорошая библиотека, потому что я делаю это в первую очередь в учебных целях.