修改:MyClass
只是一个例子。问题实际上是关于如何重置类的一部分成员。在我的实际情况中,课程更复杂,data
将长达一百万。另外,我有复制/移动c'tors和运算符,在我的例子中省略了。
我有一个班级
class MyClass{
double *data;
int data_length;
MyClass() : data(nullptr), data_length(0){}
~MyClass(){
if(data != nullptr){
delete[] data;
}
}
}
现在我想添加一个新的成员函数reset()
。
以下哪项是更好的做法?
(a)中
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = new double[in_length];
memcpy(data, in_data, in_length * sizeof(double));
data_length = in_length;
}
和
(b)中
MyClass::reset(double* in_data, int in_length){
if(data != nullptr){
delete[] data;
}
data = in_data;
data_length = in_length;
}
似乎(a)更安全,但更耗时,并且(a)的客户在调用in_data
后必须手动删除临时reset()
。 (b)效率更高,但客户可能会在外面删除in_data
。
答案 0 :(得分:2)
只有一个数据成员:
std::vector<double> data;
然后:
void reset(std::vector<double>&& new_data) { data = std::move(new_data); }
void reset(const std::vector<double>& new_data) { data = new_data; }
如果隐式允许,上面的第一个重载将从过期的vector<>
移动数据,或者使用std::move()
明确授予调用代码的权限,否则第二个重载将复制:
myClass.reset(get_new_data_vector()); // moves returned vector
std::vector x = { ... };
myClass.reset(x); // do a full "deep" copy
myClass.reset(std::move(x)); // explicitly allow move from named local var
如果您有其他数据集合,则可以为每个数据集合执行类似的操作 - 每个数据集合都可以高效且独立地进行更新。
答案 1 :(得分:-1)
最好复制数据而不依赖于外部世界,特别是当你有一个析构函数来删除类没有分配的内存时。