ssd*_*ssd 8 c string malloc char
有没有办法(在纯C中)区分malloced字符串和字符串文字,而不知道哪个是哪个?严格地说,我正试图找到一种方法来检查变量是否是一个malloced字符串,如果是,我会释放它; 如果没有,我会放手.
当然,我可以向后挖掘代码并确保变量是否被malloc编辑,但以防万一存在简单方法...
编辑:添加行以使问题更具体.
char *s1 = "1234567890"; // string literal
char *s2 = strdup("1234567890"); // malloced string
char *s3;
...
if (someVar > someVal) {
s3 = s1;
} else {
s3 = s2;
}
// ...
// after many, many lines of code an algorithmic branches...
// now I lost track of s3: is it assigned to s1 or s2?
// if it was assigned to s2, it needs to be freed;
// if not, freeing a string literal will pop an error
Run Code Online (Sandbox Code Playgroud)
有没有办法(在纯C中)区分malloced字符串和字符串文字,
没有任何便携方式,没有.不用担心; 有更好的选择.
当你用C编写代码时,你会这样做,同时对"谁"拥有内存做出强有力的保证.来电者是否拥有它?那么他们有责任解除分配.被叫方拥有它吗?类似的事情.
你编写的代码非常清楚监管链和所有权链,你不会遇到诸如"谁解除分配这个问题?"之类的问题.你不应该觉得有必要说:
// after many, many lines of code an algorithmic branches...
// now I forgot about s3: was it assigned to s1 or s2?
Run Code Online (Sandbox Code Playgroud)
解决方案是; 别忘了!您可以控制代码,只需查看页面.设计它是防止泄漏内存到其他功能,而没有清楚地理解"嘿,你可以阅读这个东西,但不能保证它在X或Y之后有效.它不是你的记忆,如此对待它".
或许这是你的记忆.一个很好的例子; 你的电话strdup. strdup让你知道(通过文档)你有责任解除它返回给你的字符串.你如何做到这一点取决于你,但最好的办法是尽可能缩小范围,并尽可能短时间保持它.
这需要时间和实践才能成为第二天性.您将创建一些在您擅长之前处理内存不佳的项目.没关系; 你一开始的错误会告诉你究竟什么不该做,你将来会避免重复它们(希望如此!)
另外,正如@Lasse在评论中提到的那样,你不必担心s3,这是一个指针的副本,而不是整个内存块.如果你打电话给免费s2,s3你最终会得到未定义的行为.