假设在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时防止myDatamainData更改,是否有一种简单的方法可以强制Foo构造函数进行复制?理想情况下,myData将是一个简单的数组,而不是一个指针,但是将行double* myData更改为double myData[]似乎不起作用,因为该数组的大小在运行时之前是未知的。

最佳答案

这里的参数不是动态数组:

Foo(double data[])

实际上,声明与此等效:
Foo(double * data)

甚至decltype也会告诉您它们是同一件事,并且这两个签名将作为重载发生冲突。

因此,没有分配。您只传递了指向数组第一个元素的指针。

同样,C++唯一会自动复制数组的地方是当它是一个类的成员时,并且该成员不允许使用不确定大小的空括号[]语法。 (或者,如果大小确定,则在生成复制构造函数或赋值运算符之前,由类类型完成的时间确定。)



您可以保留数据的副本,但是如果在编译时未知其大小(或至少一个上限),则将需要一个指针。我建议使用裸指针上的std::vector,或者至少使用std::unique_ptr< double[] >

10-04 14:33
查看更多