大多数帖子可能会询问为什么某些东西不起作用;我的问题是为什么 IS 工作......
我认为动态分配内存的唯一方法是在cpp中使用new
或malloc
,但这显然是错误的。以下代码编译和工作,但无法弄清楚原因!
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);
...
正如您要动态分配数组一样。我显然有一个内存分配的根本缺陷。 *有人可以解释为什么这两个都有效吗?
编辑:我编辑了我的问题,以便提出我正在寻找的实际问题。
答案 0 :(得分:3)
动态内存分配隐藏在valarray
类的构造函数内部,最后仍然使用new
或malloc
。
您也可以使用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;
}