C++ Memory Management

Primitives

直接调用分配器的使用情况。

内存 管理都是 用内存池来进行管理的。

new 表达式 分为一下几步。

分配内存 返回的是void *类型

类型转换,调用static_cast进行类型转换

调用构造函数  直接调用构造函数只有编译器才可以直接调用,需要调用placement new在这个对象地址上面构造对象。

返回指向对象的地址。

 

上面operator new的源码中是使用for循环来一直进行内存的malloc,如果直接成功,就直接返回,如果失败,就对调用你自己设置的在内存分配失败的时候需要执行的动作,这是C++提供的一种在内存分配失败的时候的机制。这个函数时保证不抛异常的,C++11中可以使用noexcept这一新特性。

delete的过程 会先调用析构函数 然后将内存释放调。

 string在标准库里面是一个typedef,真正的名称是basic_string。

 

这里指的内存泄漏 是由于析构函数没有调用而导致的。不是array本身,而是上图的这种情况没有调用析构函数造成的。

 在进行array new表达式的使用的时候,是没有机会进行对象的初值,因此需要一个默认构造函数来进行数据的初始化。

VC6下的内存布局。

array的大小被写到了内存块当中的cookie当中了,因此会占用更多的内存资源空间。

猜你喜欢

转载自www.cnblogs.com/randyniu/p/9125618.html