考虑一个模板容器类,它包含在堆上分配的缓冲区:
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按值分配。但我没有运气。
有没有办法按值分配给堆上的_buffer?
答案 0 :(得分:3)
您 “按值分配”。但是,您的test
类没有实现赋值运算符operator=
,因此赋值调用编译器生成的默认赋值运算符,该运算符只是逐个成员复制。因此浅层任务存在问题。
此外,如果other._ptrInt
为nullptr
,您的副本构造函数将会爆炸。