【问题标题】:Freeing non-malloc'd memory释放非 malloc 的内存
【发布时间】:2021-04-28 00:06:36
【问题描述】:

假设我声明了以下数组:

char *arr[3];

在运行程序期间,根据用户的输入,我可能会也可能不会将内存字符串分配到这个数组中(意思是arr[i])。

在程序结束时free(arr[i]) 是否安全而不检查我分配了哪些?或者这会导致错误吗?

谢谢!

【问题讨论】:

  • 如果arr[i] 指向NULL 是安全的,使用未初始化的指针调用free 是未定义的行为。
  • char *arr[3]; 上的免费电话是undefined behavior。在某些平台上,它可能会导致分段违规。在 所有 平台上 - 这只是“错误”。不要这样做!另见:free() function without malloc or calloc
  • @paulsm4:如果char *arr[3];被定义为一个全局变量,它将被初始化为空指针并且调用free(arr[0])就可以了。你能说得更具体点吗?

标签: c visual-studio malloc free


【解决方案1】:

将空指针传递给free 是安全的,所以如果你的数组是用空指针初始化的,你可以安全地释放所有arr[i],假设你只存储由malloc() 和朋友返回的指针而不是在别处释放它们。

定义数组为

char *arr[3] = { NULL, NULL, NULL };

或者干脆

char *arr[3] = { 0 };

NULL0'\0' 可用于指定空指针,但建议遵循简单的清晰规则:

  • 使用NULL 作为空指针,
  • 0 用于空整数,
  • 使用'\0' 表示char 数组中的空字节,也称为空终止符。

您可以使用= { 0 }; 作为任何 C 对象的初始化器:所有元素和成员都将被初始化为其类型的零值,但只有第一个成员以这种方式初始化的联合除外。

【讨论】:

  • 一个问题,我们可以用\0代替NULL吗?
  • @RohanBari:如果你的意思是'\0',技术上是的,因为'\0' 是一个int 常量,其值为0,因此它是指针上下文中的空指针。但是使用字符常量来初始化指针会非常混乱char *arr[3] 是 3 个指针的数组,而不是指向 3 个 char 的数组的指针,写成 char (*arr)[3]。更多细节在这里:stackoverflow.com/questions/1296843/…
  • 这里有一个简单的清晰规则:使用NULL 表示空指针,0 表示空整数,'\0' 表示char 数组中的空字节,即也称为空终止符。
  • @chqrlie:我要添加另一条规则:使用{0} 将(可能是嵌套的)数组或结构的所有成员初始化为零,无论类型如何,在没有其他值的情况下感觉[例如如果一个结构包含数组中有效项目的数量,然后是数组,我认为使用 ...0, {0}... 将计数初始化为零并且所有项目为零比所有元素的值的显式列表。
  • 仅仅因为你“可以”,并不意味着你“应该”。充其量,故意在一个你知道你没有 malloc() 的对象上调用“free()”是“不正当的”。这也是不必要的代码/不必要的运行时开销/不需要的代码膨胀。在最坏的情况下 - 这是一个维护噩梦 - 并且在修改代码时等待发生的潜在错误。不要这样做!
猜你喜欢
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多