0

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

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?

4

1 回答 1

3

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

other._ptrInt此外,如果is ,您的复制构造函数将爆炸nullptr

于 2013-07-22T23:55:08.430 回答