假设在C++中,我有以下代码:
class Foo {
private:
double* myData;
public:
Foo(double data[]) {
myData = data;
}
}
int main() {
double mainData[] = {1.0};
Foo myfoo(mainData);
}
据我所知,
mainData
在传递给Foo
构造函数时被视为指针,因此myData = data
行仅分配了指针地址。所以这里没有分配额外的内存,对吗?但是,Foo
类是否负责提供用于释放myData
内存的析构函数?还是我们有一个动态数组指针实际上指向堆栈内存?另外,如果我想在更改
Foo
时防止myData
的mainData
更改,是否有一种简单的方法可以强制Foo
构造函数进行复制?理想情况下,myData
将是一个简单的数组,而不是一个指针,但是将行double* myData
更改为double myData[]
似乎不起作用,因为该数组的大小在运行时之前是未知的。 最佳答案
这里的参数不是动态数组:
Foo(double data[])
实际上,声明与此等效:
Foo(double * data)
甚至
decltype
也会告诉您它们是同一件事,并且这两个签名将作为重载发生冲突。因此,没有分配。您只传递了指向数组第一个元素的指针。
同样,C++唯一会自动复制数组的地方是当它是一个类的成员时,并且该成员不允许使用不确定大小的空括号
[]
语法。 (或者,如果大小确定,则在生成复制构造函数或赋值运算符之前,由类类型完成的时间确定。)您可以保留数据的副本,但是如果在编译时未知其大小(或至少一个上限),则将需要一个指针。我建议使用裸指针上的
std::vector
,或者至少使用std::unique_ptr< double[] >
。