严格地说,C标准是否要求free必须在malloc之后调用?当不满足这一要求时,它规定了什么



来源http://en.cppreference.com/w/c/memory/malloc:

返回的指针必须用free()或realloc()解除分配。

来源http://en.cppreference.com/w/c/memory/calloc:

返回的指针必须用free()或realloc()解除分配。

严格来说,为什么必须释放返回指针

现在我知道POSIX命令在程序终止时释放内存,所以在实践中调用malloc并立即终止不会造成任何伤害。但这不是我要问的。

这一硬性要求("必须解除分配")是否存在于C标准中,或者这是cpprreference贡献者的发明,以敦促程序员不要泄露内存?如果标准中存在这样的硬性要求,这是否意味着,根据C标准(POSIX和其他与操作系统相关的东西除外!),如果malloc返回的指针不是free'd,则程序为UB,或者标准是否定义了未能满足此要求的后果?(这将特别有趣,因为这可能意味着标准处理程序已经终止时发生的事情!)

当他们在cppreference.com上说"返回的指针必须用free来释放"时,他们的意思并不是程序员必须做的命令。它的意思更像是"当分配的内存被释放时,必须用free或realloc来完成,因为只有那些函数才能正确地完成。"在实际的规范中没有这样的命令。

C不要求您在分配后释放()内存。

副作用是内存泄漏。但你永远不会看到任何错误或警告。这是你作为程序员的工作。

不,绝对不需要释放任何内存。这样做是为了您自己,允许实现再次使用它来满足将来对malloc的调用。

此外,对于C程序之外或终止之后机器/OS的状态,C没有任何可说的。指定这一点取决于操作系统或管理它的标准,在实践中,对于任何多进程操作系统,malloc获得的内存和其他类似资源都会在进程终止时消失。

句子返回的指针必须用free()或realloc()释放在C11标准草案n1570中不存在。

严格地说,这个标准并没有说这个对象必须被释放。它甚至没有明确表示内存块需要由freerealloc释放——只是该标准没有提供任何可用于释放空间的其他函数。

但是,也不能保证它们在程序退出时被释放——相反,所有的语言都允许通过main输入的程序仍然可以通过不调用free来泄漏内存,并且仍然在一致的实现上运行。标准6.2.4p2中规定:

2对象的生存期是程序执行的部分,在此期间保证为其保留存储。一个对象存在,有一个恒定的地址,33)并在其整个生命周期中保留其最后存储的值。34)如果一个对象在其生命周期之外被引用,则该行为是未定义的。当指针所指向的对象(或刚刚过去的对象)达到其生命周期结束时,指针的值将变得不确定。

和7.22.3p1:

已分配对象的生存期从分配一直延长到解除分配。

就是这样。C标准不关心程序执行终止后发生的任何事情。这是一种未被遗漏所定义的行为,因此任何一种可能的行为都符合标准。

虽然realloc()free()是在C中释放内存的最自然方式,但在C++中释放内存最自然的方式是delete。虽然链接的页面用C语言描述行为,但该语言与用C++描述行为的页面平行:

成功时,返回指向新分配内存开头的指针。必须使用std::free()或std::realloc()释放返回的指针。

我怀疑描述C++的文本的预期目的是明确其他释放存储的方式,包括delete,不适合与从std::mallocstd::calloc接收的存储一起使用;在描述C时出现了相同的文本,尽管C缺乏任何其他预期的方法。

相关内容

  • 没有找到相关文章