例如,考虑一个模板容器类,它包含一个在堆上分配的缓冲区:
T *_buffer = new T[SIZE]
只是一个指向 T 类型的 c 数组的简单指针。
这个类是模板化的。但是,我在将对象的深层复制到我的缓冲区时遇到了问题。
在我的单元测试中,我设置了一个测试类:
class test
{
public:
int* _ptrInt;
test() {_ptrInt = nullptr;}
test(const int i)
{
_ptrInt = new int;
*_ptrInt = i;
}
test(const test& other)
{
_ptrInt = new int;
*_ptrInt = *other._ptrInt;
}
~test()
{
delete _ptrInt;
}
};
在我的容器上,我调用 set,将临时数据作为数据传递:
container.set(0, test(5));
// destructor called on copy immediately after statement, invalidating deep copy in buffer
void set (const int& index, const T& data)
{
int i = realign(index);
T copy = data;
_buffer[i==SIZE?i-1:i] = copy; // ternary statement and index work
}
但是,_buffer 将副本作为引用,当副本超出范围时,它会删除保存在 _buffer 中的相同指针。我试图强制 _buffer 按值分配。但我没有运气。
- memcpy 仍然复制指针以指向相同的地址
- 正确调用了测试复制构造函数
- 移动语义将要求类具有移动构造函数
- std::vector 以某种方式实现了这个以正确复制,无论它的 T/T*、堆/堆栈、带/不带移动构造函数,所以我知道它必须是可能的
有没有办法可以按值分配给堆上的_buffer?