编程文汇

c++显式调用constructor和destructor

cxx
#1

可能会觉得没必要这么做,没啥用。不过,在特定情况下是有用的,比如,用malloc为几个不同class的对象连续分配内存,调用constructor进行初始化,调用destructor进行清理,然后,用free释放内存。

举个具体的例子,比如make_shared,它一次性分配了计数指针和数据指针,怎么做到的?应该就是利用类似的方式做的。

接下来 我具体看以下 怎么调用:

auto addr = malloc( sizeof(T));
//把地址addr传给new,把参数传给T的构造函数,这样 我就得到了一个T对象的指针。
T *p = new (addr) T(args...);

//析构,直接调用就行
p->~T();
//然后释放内存
free(addr)

我在改进自己写的LocalSharedPtr的时候,就使用了这样的方式,一次性的分配计数指针和实际的对象指针。不过最开始时我用了delete去释放对象,总出错,后来意识到时这里出错,改成上述方式,运行正常。

那为什么不用struct把int和T分配到一起呢?我最开始就是这么做的。这样有个最致命的缺陷:声明指针的时候时不需要知道class的完全定义的,只需要知道声明就行,但是如果用struct来分配,就必须预先知道class的完整定义,也就不能像普通指针那样方便的定义了。

0 Likes