在施工完成之前,操作员可以获得新的返

Dan*_*atz 1 c++ multithreading new-operator

在堆上构造对象在C++语言中看起来很简单.当代码

T* object = new T();
func(object);
Run Code Online (Sandbox Code Playgroud)

被调用,我的理解是必须首先分配内存,然后初始化,最后调用类的构造函数.此外,构造完成之前,对象的虚拟表不一定可用.

我的问题是:operator new在对象构造完成之前,可以返回指向已分配/初始化内存的指针,这样可以func(...)在一个未完全构造的对象上运行吗?这个问题的答案对我正在开发的多线程库有影响.

提前致谢.

Pet*_*ker 6

operator new分配内存.的new关键字(如在示例代码中使用)使用operator new分配内存,然后构造该对象在该存储器中.并且,是的,在没有正确同步的多线程应用程序中,指针值可以在构造函数的副作用发生之前在其他线程中可见.这是因为每个处理器都可以有一个单独的缓存,并且在构造函数的副作用被读入缓存之前,指针值可能会被读入缓存.阅读"双重检查锁定"了解更多详情.