哪个是重置功能的更好做法?

Which is a better practice for a reset function?

编辑MyClass只是一个例子。问题实际上是关于如何重置class的部分成员。在我的实际情况下,class 更复杂,data 将长达一百万。另外,我有 copy/move 个 c'tors 和运算符,在我的示例中省略了它们。

我有一个class

class MyClass{
     double *data;
     int data_length;         

     MyClass() : data(nullptr), data_length(0){}

     ~MyClass(){
         if(data != nullptr){
             delete[] data;
         }
     }
}

现在我想添加一个新的成员函数reset()。 以下哪项是更好的做法?

(一)

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)的clients在调用reset()后还得手动删除tempin_data。 (b)效率更高,但是有风险,客户端可能会在外面删除in_data

最好复制数据,不要依赖外部世界来获得这些东西,尤其是当你有一个析构函数来删除 class 没有分配的内存时。

刚好有一个数据成员:

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; }

如果隐式允许或您使用 std::move() 在调用代码中明确授予权限,上面的第一个重载将从即将到期的 vector<> 移动数据,否则第二个重载将复制:

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

如果您有其他数据集,您可以对每个数据集执行类似的操作 - 每个数据集都可以高效且独立地更新。