堆区是不是汇编中的"扩展数据区"(ES) ?
代码区 <=> [CS] 这个应该没错
栈区 <=> [SS] 也没错
但是... ...
全局数据区 <=> [DS] ? 不确定了,常量\全局变量\静态变量\字符串 是否存放在[DS] ?
堆区 <=> [ES] ??更不确定了!
另外,
char* p = new char[10];
delete[] p; //释放p的时候如何知道它占用的是10个字节?
[解决办法]
不要把 “进程地址空间/可执行文件/编程语言概念” 这几种不同的东西中相似的名称给搞混了
堆是一种管理内存的方式,可以由操作系统API维护,也可以由编译器库函数维护,本身就是个纯运行时的东西,不需要单独有个“段”(可执行文件的分段)来保存
[解决办法]
new函数在执行的时候将会告知系统在堆中预留10字节大小,然后告知p首地址。delete会告知系统解除这段预留大小,并且将p指针置为NULL。
[解决办法]
或者说,狭义的汇编语言,不考虑操作系统调用,不考虑库函数的话,本身就没有C/C++语言中对应的堆的概念
堆本身使用了某种数据结构来管理内存,自然保存了你分配的大小
[解决办法]
[解决办法]
至于什么时候分配函数会使用之前释放的空间,这由系统来决定。
[解决办法]
[解决办法]
[解决办法]
是的,try catch 是个好习惯,可是经常偷懒。
[解决办法]
不是。
堆是操作系统内存管理中的概念。
ES是CPU的一个段寄存器。
两者没有必然联系。
[解决办法]
扩展阅读:
http://blog.csdn.net/happylife1527/article/details/7879370
[解决办法]
没有对应关系,一个是CPU中的,一个是内存中的,它们之间靠总线联系。
[解决办法]
但是对于Intel CPU 汇编是有内存模式的概念的,比如small、compact、huge等模式。也就是那些段寄存器的默认用途。不过这个基本上是实模式汇编和段分址启用情况下才用的,TC等也沿用了这个东西。
这个地方有说明:
http://www.360doc.com/content/08/1228/01/91638_2213443.shtml
不同模式下,DS、ES等都有默认的用途。
但是在32位/64位的现代操作系统,基本上都不使用分段机制,只用分页,所有的段起始都是0。所以也就不存在你说的对应关系了。编译器的确会分别代码段、数据段之类的东西,但是已经和CPU的段寄存器没有直接关系了。