“释放”由“malloc”返回的指针总是安全的吗?

问题描述 投票:0回答:1

我的理解是,只允许使用调用

free
(或返回指向堆上动态分配的某些内存的指针的任何其他函数,如
malloc
strdup
)返回的指针来调用
asprintf
如果知道两个函数都在同一个堆上运行。因此,我理解“一般方法”应该是提供一个补充的释放例程,而不是在从分配它的函数返回的任何指针上调用
free
,因为在一般情况下,我们永远不知道指针是否已经超越了任何能影响它的界限。我认为直接在我们提交的指针上调用
free
应该更像是一种特殊情况,当我们确定我们持有的指针对于我们来说是安全的(例如,我们free
-ed 或 
strdup
 它自己,或者我们知道分配它的例程位于“关闭”的某个地方,并且指针没有通过任何边界)。
但是,我已经很久没有做过任何专业的C了,而且当时做的也不是很多,所以我可能只是知道错了。我遇到了许多观点,认为在任何(有效的、非释放的)分配的指针上调用 
malloced

通常是安全的,并且仅在明确知道有必要时才应使用自定义释放例程。但这在某种程度上与我在 Windows 上使用 Visual Studio 6 的记忆形成鲜明对比,在 Windows 上,在任意已知已分配的指针上成功调用

free

 取决于“静态/静态”的三维兼容性矩阵中的位置。分配和解除分配方的动态链接运行时”、“调试/发布构建”和“单/多线程运行时”。
我的问题是:在我确定已被 
free

-ed 而不是

free

-d 的指针上调用 
malloc
 的通用且实用的规则是什么?什么时候是安全的,更重要的是,什么时候不安全?如果我创建一个返回 
free
 指针的函数,我是否应该始终提供一个单独的函数来释放它,或者(在一般情况下)是否足以说 
“通过调用
malloc
来释放返回的内存?我刚刚还给你的指针”?从实际的角度来看,遇到调用
free
malloc
 在不兼容的堆上操作或以任何其他方式不对称的情况的可能性有多大?让我们假设指针指向一些琐碎的数据,而不是指向一些不透明的结构,该结构保存一些额外的簿记信息,并且需要一些复杂的逻辑来释放已使用的内存。

c malloc free allocation
1个回答
0
投票

free
语言对堆一无所知。它只知道对象的存储持续时间。由

C

族函数创建的对象具有
分配的存储持续时间
分配的存储持续时间对象一直存在,直到通过调用malloc函数释放为止。因此,符合要求的程序应该free
任何
free
内存安全
如果您的程序不符合标准并使用许多不同的 
malloc

实现(即动态库使用与主程序不同的实现),很明显,您的主程序

malloc

 不应该在由不同实现分配的对象上使用
free

© www.soinside.com 2019 - 2024. All rights reserved.