执行期语意学,即在程序执行时,编译器产生而外的指令调用,确保对象的构造,内存的释放,以及类型转换与临时对象的生成的安全进行。
一、对象的构造和析构
对于类对象的构造,我们应该尽量在需要使用时才进行定义,一般在定义之后则开始内部的构造过程。
而对于已构造的对象,其析构函数必须放在每一个离开点(当object还存在)之前。
二、全局对象
- 为每个需要静态初始化的文件产生一个_sti()函数,内含必要的constructor调用操作和inline expansions。
- 为每一个需要静态的内存释放操作的文件,产生一个_std()函数。
- 提供一个_main()函数调用所有的_sti()函数,一个_exit()函数调用所有的_std()函数
三、局部静态对象
四、对象数组
Point knots[ 10 ];我们一般使用vec_new()函数来构造数组(这是在cfront中的方式), 对于VS等,则提供一个用来处理没有"virtual base class"的class,另一个用来处理"内含virtual base class"的class。后一个函数通常称为 vec_vnew()。函数的原型一般如下:void *
vec_new(
void *array, // 数组的起始地址
size_t elem_size, //每一个class object大小
int elem_count, //数组中的元素个数
void (*constructor)(void *) //类的constructor函数指针
void (*destructor)(void *, char) //类的destructor函数指针vec_new( &knots, sizeof(Point), 10, &Point::Point, 0);同理,对于对象的删除,也有类似的vec_delete()来进行操作。void *
vec_new(
void *array, // 数组的起始地址
size_t elem_size, //每一个class object大小
int elem_count, //数组中的元素个数
void (*destructor)(void *, char) //类的destructor函数指针五、new和delete运算符
int *pi = new int(5);其实是通过两个步骤完成的,第一步通过适当的new运算符函数实例,配置所需的内存,然后将配置来的内存设定初值。Point *ptr = new Point3d[10];如果一定要这样做,默认情况下只会交给施行vec_delete()函数的”被删除之指针类型的destructor“,也就是Point destructor。for(int ix = 0; ix < elem_count; ++ ix) {
Point3d *p = &((Point3d*)ptr)[ix];
delete p;
}
Point2w *ptw = new (arena) Point2w其中arena是指向内存的一个区块,用以放置产生的Point2w object。Point2w *ptw = (Point2w*) arena;
if(ptw != 0)
ptw->Point2w::Point2w();所以Placement new operator的好处就是决定object放在那里,并在此地施行constructor。#include <iostream>
#include <typeinfo>
using namespace std;
class Point {
public:
Point(int x, int y) : _x(x), _y(y) {};
void test() { cout << "hello word:" << _x << _y << endl;}
~Point(){ cout << "destructor" << endl; };
protected:
int _x, _y;
};
int main()
{
char *arena = new char[sizeof(Point)];
Point *pt = new (arena) Point(1, 3);
pt->test();
//delete pt;
pt->~Point();
pt = new (arena) Point(2, 3);
pt->test();
cout << (pt != nullptr) << endl;
return 0;
}
p2w->~Point2w;
p2w = new (arena) Point2w;
1166




被折叠的 条评论
为什么被折叠?



