有没有一种方法(在纯C中)来区分malloc
从字符串文字中提取字符串,而不知道哪个是哪个?严格来说,我试图找到一种方法来检查变量是否是 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
有没有办法(在纯 C 中)区分 malloced 字符串和字符串文字,
不是以任何便携式方式,不。不过无需担心;有更好的选择。
当您用 C 语言编写代码时,您会同时对“谁”拥有内存做出强有力的保证。调用者是否拥有它?然后他们有责任取消分配。被调用者拥有它吗?类似的事情。
您编写的代码非常清楚监管链和所有权,并且您不会遇到诸如“谁取消分配这个?”之类的问题。你不应该觉得有必要说:
// after many, many lines of code an algorithmic branches...
// now I forgot about s3: was it assigned to s1 or s2?
解决办法是;别忘了!您可以控制您的代码,只需稍微查找一下页面即可。将其设计为防弹,防止内存泄露给其他函数,而没有清楚地理解“嘿,你可以读这个东西,但不能保证它在 X 或 Y 之后有效。这不是你的内存,请这样对待它” ”。
或者也许这是你的记忆。恰当的例子;你的电话strdup
. strdup
让您知道(通过文档)您有责任释放它返回给您的字符串。如何做到这一点取决于您,但最好的选择是将其范围限制得尽可能窄,并且仅在必要时保留尽可能短的时间。
这需要时间和练习才能成为第二天性。您将创建一些处理内存的项目poorly在你擅长之前。没关系;你一开始所犯的错误将会教会你什么not这样做,你将来就可以避免重复这些事情(希望如此!)
另外,正如 @Lasse 在评论中提到的,你不必担心s3
,这是一个副本一个指针的,而不是整个内存块。如果您拨打免费电话s2
and s3
你最终会得到未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)