我正在玩我的自定义字符串库,顺便说一下这很糟糕,但我是为了体验而做的。
无论如何,我有一些函数为String*
分配一块内存来使用,它运行正常。调用string_delete(string*)
函数时,将释放所有使用的内存。
但是我提出了一种将char*
表示为String*
的新方式,但我担心我为它保留的记忆并没有被释放。这是功能:
String* String_ToN(char* dest) {
String* temp = calloc(1, sizeof (struct String));
temp->length = strlen(dest);
temp->buffer = (char*) malloc(temp->length + 1);
strncpy(temp->buffer, dest, temp->length);
return temp;
}
我不喜欢使用strdup
因为它不是标准c所以我会坚持使用malloc
和strncpy
。
这是有效的,我使用它是这样的:
String_GetLength(String*)
接受String*
参数,因此如果我在调用它时放入一个字符串文字,我会收到错误。
所以我转而去String_GetLength(String_ToN("hello"))
,它会像我预期的那样返回5。
但是String_ToN
再次使用calloc
和malloc
,我如何释放这段记忆并仍能使用ToN
?
答案 0 :(得分:2)
与C ++不同,C中没有自动资源管理(因为没有析构函数)。你必须做类似的事情:
String *hello = String_ToN("hello");
int len = String_GetLength(hello);
String_free(hello);
其中String_free
执行所有必要的清理。
答案 1 :(得分:1)
您需要一个功能来删除或释放String
- s,也许
void String_delete(String *s) {
if (!s) return;
free (s->buffer);
// you might want memset(s, 0, sizeof(*s)); to catch more bugs
free (s);
}
您可能希望在free
之前将内存归零(如在注释代码中)。它可能有助于捕捉悬挂指针错误。但是你可以使用像valgrind这样的工具来捕获它们。或者,使用Boehm's garbage collector非常有用:您可以使用GC_malloc
代替malloc
(等等),也不用打扰free
或{{1} }。根据经验你会发现释放内存成为大型编程项目中的一个主要问题(不,RAII成语不是银弹。)
答案 2 :(得分:0)
正如Oli Charlesworth指出的那样,你必须创造出温和的对象。但是,您也可以添加标志
int dispose;
到你的String结构,然后在传递给某个函数时设置它。然后,获取String的每个函数都必须检查此标志,如果设置,则释放String结构。代码可能如下所示:
Process_String(String_ToN("Hello", 1));
然后
Process_String(String *str) {
/* do smth with str */
if(str->dispose)
String_Delete(srt);
}
我同意这种设计更容易出错,而不是事情如何正常完成。因此,将其视为教育范例,不多也不少。