【发布时间】:2015-04-22 08:29:56
【问题描述】:
编辑: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)的客户端调用reset()后必须手动删除tempin_data。 (b) 效率更高,但有客户端可能会在外面删除in_data的风险。
【问题讨论】:
-
为什么要“重置”一个对象? (另外,为什么没有
std::<shared/unique>_ptr?) -
在第一个变体中,您错过了分配。无论如何,您已经发现了引入移动语义的问题。什么更好取决于您的用例。
-
std::vector看起来更合适,但是是的,为什么要推出自己的内存管理?这些东西存在于标准库中;你只需要使用它,而不是重新实现它。 (旁注:delete nullptr;什么都不做,所以不需要检查) -
@JBL 只是一个例子。如果一个类有多个数据指针,我想更改其中一个。我想重置它,而不是重建整个班级。
-
如果你的类 MyClass 是一个资源类,用所有的常规成员尽可能简单地编写它。然后,您将使用 MyClass 的实例而不是无风险的双指针。如果这不是练习,请使用 std::vector。