【发布时间】:2018-03-17 10:37:04
【问题描述】:
我有一个使用 RAII 编写的 Array 类(为了本示例的目的而进行了超级简化):
struct Array
{
Array(int size) {
m_size = size;
m_data = new int[m_size];
}
~Array() {
delete[] m_data;
}
int* m_data = nullptr;
int m_size = 0;
};
然后我有一个函数,它引用一个数组并对其进行一些操作。我使用一个临时数组temp 来执行处理,因为有几个原因我不能直接使用引用。完成后,我想将数据从临时数组传输到真实数组:
void function(Array& array)
{
Array temp(array.m_size * 2);
// do heavy processing on `temp`...
array.m_size = temp.m_size;
array.m_data = temp.m_data;
}
明显的问题是temp 在函数末尾超出范围:触发了它的析构函数,进而删除了内存。这样array 将包含不存在的数据。
那么,将数据所有权从一个对象“移动”到另一个对象的最佳方式是什么?
【问题讨论】:
-
“最好的方法”是完全避免使用原始指针和数组并使用
std::vector。 -
或者如果你真的坚持这样做(例如:因为这是一个练习)那么你需要实现你自己的复制和移动构造函数(参见:The rule of three/five/zero)
标签: c++ c++11 memory move-semantics temporary