为什么替换malloc()需要了解链接器,而::operator new()不需要
Why does replacing malloc() require knowledge of the linker but ::operator new() does not?
参见链接问题
全局操作符new和malloc的区别
被接受的答案是,
"替换malloc打开了一罐蠕虫。这是可以做到的,但不是可移植的,因为它需要了解链接器。"
为什么替换malloc需要链接器的知识,为什么替换::operator new()不需要?
标准c++为覆盖::operator new
做了规定。虽然实现肯定是混乱的,并且与链接器相关,但c++程序可以定义不同的::operator new
并且它可以工作。c++标准明确地说:程序可以用它们自己的定义(等等,各种限制和细节)来代替这些。
malloc
是在普通库中定义的普通函数,C(以及c++)没有替换这样的函数的功能。您几乎可以说服太阳下的每个链接器链接到您的libc
和malloc
,并将对malloc
的引用解析为来自另一个库/对象文件的一些代码。但是你不能仅仅定义一个不同的malloc
函数,因为这违反了单定义规则:你最终会在程序中得到两个称为"malloc"的函数,这两个函数都是被标准禁止的(对于非static
,非匿名- namespace
,非inline
,…函数)和链接器的严重问题(很可能是一个错误或两个定义中的一个被删除)。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- 为什么替换malloc()需要了解链接器,而::operator new()不需要