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

时间:2015-04-22 08:29:56

标签: c++ memory reset

修改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

2 个答案:

答案 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)

最好复制数据而不依赖于外部世界,特别是当你有一个析构函数来删除类没有分配的内存时。