STL空间构造器

来源:互联网 发布:兄弟打印机扫描软件 编辑:程序博客网 时间:2024/04/29 14:43

c++程序用new/delete运算符进行动态内存操作时,编译器为我们准备了两项工作。一是,调用全局内存分配函数 operator new() / operator delete() 二是,调用 “构造函数”和“析构函数”。

下面举个例子说明:

class TestType

{

public:

TestType(){}

~TestType(){}

private:

    int m_test;

}

 

TestType* ttData = new TestType();

对于这里的new分配内存,

(1)        编译器调用operator new(sizeof(TestType)) 分配内存。

(2)        编译器调用TestType ::TestType()构造函数,构造对象。

 

delete ttData;

ttData = Null;

对于这里内存释放:

(1)        编译器首先调用TestType ::~TestType(),释放成员对象的资源。

(2)        编译器调用 operator delete(ttData)释放内存。

 

     bbg中的容器可以放置任何用户自定义类型,但是我们之前提供的simple_alloc alloc_pool只有释放和分配内存,没有调用具体类的构造函数和析构函数。还好c++提供了“定制new特性”(喜欢c++就是因为它的灵活)可以满足我们的目的,即在已有内存空间上调用具体类的构造函数。定制new的语法如下:

 

void * ttData = operator new(sizeof(TestType);

new(ttData) TestType(); //定制new,在指针ttData所指内存上调用 TestType的构造函数

   

   对于内存空间的释放,我们则可以通过显式调用析构函数完成。如,

ttData->~TestType();

   

 

具体源码: