不使用运行时库时“新”使用什么?

时间:2010-12-10 01:49:39

标签: c++

例如,在C中,没有没有运行时库(libc)的malloc()。我想例如,在Windows上,malloc只调用HeapAlloc()。但是在C ++中,分配动态内存的方式实际上是语言的关键词;同样的“删除”。因此,如果在没有运行时库的情况下编译代码,“new”将如何工作?

由于

3 个答案:

答案 0 :(得分:2)

如果new运算符没有重载,则它通常与malloc函数相同。 依赖于平台。唯一的区别是,它会自动管理数据的初始化。

编辑:

在Linux上,没有标准库就无法编译。您收到以下消息:

phong@colinux ~ $ g++ -nostdlib test.cpp
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000080480d8
/tmp/ccOV36hW.o: In function `main':
test.cpp:(.text+0x11): undefined reference to `operator new(unsigned int)'
test.cpp:(.text+0x21): undefined reference to `operator delete(void*)'
/tmp/ccOV36hW.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status

答案 1 :(得分:0)

像任何未找到的函数指针一样。

答案 2 :(得分:-1)

动态内存分配(也是printf())需要操作系统支持。您无法编写这些功能的硬件(或OS)独立版本。

没有任何操作系统支持的程序(正如您对C的期望)将无法与外部交互,因此它无用。

这意味着这个纯粹的理论问题毫无意义。

@In silico:这是一个很难的...在控制器上,你必须知道你运行的特定硬件的一些细节,以便你知道*(char*)(0x123)^=1将切换一个led。这不是C标准中定义的内容,而是您对外部的了解。操作系统只不过是关于硬件的知识集合。 当然,你可以在没有CRT的情况下运行(就像一些病毒那样),通过在内存中查找内核地址并查找导出的函数。但同样,它只是重现CRT的功能,这对任何程序都至关重要。

@Fred Nurk:我想说的是“纯C”没有定义与硬件交互的任何标准手段,它是由OS完成的。所以没有必要运行这样的程序。例如,您无法编写将在每个系统上运行的“通用”malloc

@Phong:是的,这意味着你刚刚为它编写了CRT(或操作系统)。并且它不像“纯C”本身那样便携。

注意: 操作系统支持我还指的是有关特定硬件的知识
纯C 我指的是仅使用标准C结构的可移植代码。