**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
22天前关闭。
Improve this question
我试图写一个函数,通过发送字符串的地址(char*)到函数来释放动态分配的字符串。(发送char**)
我试过这样做:
void dstring_delete(DString* stringToDelete)
{
// Precondition: stringToDelete is not NULL
assert(stringToDelete != NULL);
free(*stringToDelete);
其中DString的定义如下:
typedef char* DString;
对函数的调用如下所示:
dstring_delete(&str1);
其中str1的类型为DString:
DString str1, str2;
我看不出哪里出了问题,但是函数调用下面的Assert失败了:
assert(str1 == NULL);
因此,我的问题是如何在此示例中正确地释放内存。
我已经尝试了发送到free函数的不同参数,也试图在这里找到相同的问题。
2条答案
按热度按时间ldfqzlk81#
我假设
str1
指向一个要释放的已分配块,释放该块的代码序列如下所示:OP对
dstring_delete
的实现似乎如下所示,但OP没有发布包括右大括号在内的完整函数定义:OP的问题不是很清楚,但我认为他们的代码包含以下序列,
str1
指向一个先前分配的要释放的块:OP写入
assert(str1 == NULL);
失败。这是因为dstring_delete
不更改*stringToDelete
的值(它将str1
变量作为别名),因此*stringToDelete
(和str1
变量)在从函数返回时仍将包含非空值。但是,assert(str1 == NULL);
意味着它期望dstring_delete
将指针值设置为NULL
。通过在释放分配的块之后更改dstring_delete
的函数体以将指针设置为NULL
,可以很容易地解决这个问题:现在,在函数调用
dstring_delete(&str1);
之后,str1
将变为NULL
,因此assert(str1 == NULL);
调用将通过。nimxete22#
字符串的变量名本身就是对该字符串的内存引用;类型是字符指针,所以变量包含一个指针,指针是一个内存地址。2所以当你调用free()的时候,你只需要传递变量的名字。
(If您使用“&”传递字符串的内存地址所在的内存地址,并且您只需要后者。)