深度复制到堆上的c-array块

时间:2013-07-22 23:31:18

标签: c++ templates containers deep-copy

考虑一个模板容器类,它包含在堆上分配的缓冲区:

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?

1 个答案:

答案 0 :(得分:3)

“按值分配”。但是,您的test类没有实现赋值运算符operator=,因此赋值调用编译器生成的默认赋值运算符,该运算符只是逐个成员复制。因此浅层任务存在问题。

此外,如果other._ptrIntnullptr,您的副本构造函数将会爆炸。