关于valarray的简单c ++问题

时间:2011-05-07 16:05:50

标签: c++

大多数帖子可能会询问为什么某些东西不起作用;我的问题是为什么 IS 工作......

我认为动态分配内存的唯一方法是在cpp中使用newmalloc,但这显然是错误的。以下代码编译和工作,但无法弄清楚原因!

int x; 
cin >> x;
valarray<double> data(x);
// initializing elements and printing the array both work fine....

这让我发疯了。 x在编译时是未知的,仅在运行时,我没有这样做:

int x;
cin >> x;
valarray<double> *data;
data = new valarray<double> (x);
...

正如您要动态分配数组一样。我显然有一个内存分配的根本缺陷。 *有人可以解释为什么这两个都有效吗?

编辑:我编辑了我的问题,以便提出我正在寻找的实际问题。

3 个答案:

答案 0 :(得分:3)

动态内存分配隐藏在valarray类的构造函数内部,最后仍然使用newmalloc

您也可以使用valarray代替vector。这两个类都可以在运行时调整大小。

复杂性隐藏在类的接口背后是一个优点。你永远不必记得调用delete,因为类的析构函数会处理它,即使异常被抛出;他们是安全的例外!

答案 1 :(得分:0)

valarray<double> (x)调用构造函数,虽然已经分配了对象(在堆栈上),但是通过此构造函数分配了数组的元素。分配元素是在构造函数内部完成的。

new valarray<double> (x)也会这样做,但它也会分配对象本身,因为使用了new。因此,对象以及数组元素将存储在堆上。

答案 2 :(得分:0)

该行

valarray<double> data;

在堆栈上自动创建一个valarray<double>对象,并调用无参数构造函数。

该行

data = valarray<double> (x);

转换为

data.operator=(valarray<double> (x));

调用带有int的valarray构造函数。最终发生的事情是在堆栈上自动创建另一个对象,然后将其分配给第一个对象。

请注意,最好是

valarray<double> data(x);

这样你只需要创建一个对象而不是创建两个对象并扔掉一个。


已编辑以解决其他OP评论

x 未知。您计划中的cin >> x;行正在设置x。因此,当调用valarray构造函数时,它将传递一个实际值。在底部,它与此没有什么不同(当然,因为内存分配是valarray的内部,它可以确保delete在对象消失时自动进行分配):

int* makeArray(int size) {
    return new int[size];
}

int main() {
    int s;
    cin >> s;

    int* theArray = makeArray(s);
    // do stuff

    return 0;
}