gpt4 book ai didi

c++ - 强制模板化对象从指针构造

转载 作者:太空狗 更新时间:2023-10-29 23:48:03 25 4
gpt4 key购买 nike

我有一个虚构的类:

template<typename T> class demonstration
{
public:
demonstration(){}
...
T *m_data;
}

在程序执行的某个时刻,我想将 m_data 设置为一大块已分配的内存,并在那里构造一个对象 T

目前,我一直在使用这段代码:

void construct()
{
*m_data = T();
}

我现在意识到这可能不是最好的主意......在某些情况下不会工作,例如,如果 T 有一个私有(private)赋值运算符。

是否有正常/更好的方法来完成我在这里尝试的事情?

最佳答案

使用放置:

new (m_data) T();

Placement new 实际上只是 operator new 函数的重载,它接受一个额外的参数——对象应该被构建的内存位置。这完全符合您的用例。

特别是,allocator 通常是这样实现 construct 的STL 容器类(除其他外)用来构造对象的方法。

由于 placement new构造一个对象而没有分配内存,因此调用 delete 来清除内存通常是错误的。销毁必须通过直接调用析构函数来进行,无需释放内存:

m_data->~T();

请注意,这种调用析构函数的语法不适用于构造函数调用,否则我们一开始就不需要放置新的。 IE。没有 m_data->T()

关于c++ - 强制模板化对象从指针构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com