new

这次分析一下new做了什么

new 函数在调用前会传一个长度作为参数

new 单个变量和 new 多个变量是有具体区别的, 调用的函数都不一样

至于 new 的逻辑, 我并没有在代码中找到, 即使是 objdump 之后的也没有

想了一下, 那可能是个动态库地址

接下来看一下和 new 成套的 delete

 

delete/delete[]

感觉挺正常的, emmm...

单个对象调用调用的是单个对象的 delete, 而数组对象则是调用 delete[]

如果数组的元素是类类型, 那么还要麻烦一点, 会逆序调用对象的析构函数, 再调用 delete[]

(其中有一个细节就是, 成套的数组对象的 new 要比 单个 new 多 8 字节)

(也就是你单个 new 对象, new 10 个, 和 一次性 new 10 个是不一样的, 后者会多出 8 字节来存储大小)

那么问题在于 __ZdaPv 和 _ZdlPv 的区别是什么, 它对象的 _Znam 和 _Znwm 的区别又是什么?

暂时没有办法观察它的行为, 不过已经生成的数据是可以观察的, 我打算看看它前面的数据

按照 gcc 的风格, 一般都会在数据的前面放点东西

 

编译器的数据

将其地址前的 8 字节数据打印了出来, 观察一下结果

除第一次外, 按照字节数来算的话, 每多 16 个字节, 大小发生一次变化

并且每个都多余了 9 字节, 如果按 16 的倍数来算的话, 每次多余了 1 个字节

(我将 int 换成了 char 类型, 但是结果却是 0 ... 有点头疼...)