复杂数组的数组

时间:2016-07-05 12:42:08

标签: c++ arrays

我正在使用数组和数组数组:

typedef std::valarray<Complex> CArray;

CArray ca;

CArray x[16];

做:

x[0] = ca;

做硬拷贝还是仅仅参考?

如何使CArray x[16]只是一个包含16个指针的列表,这些指针将在以后分配给现有数组?即如何避免硬拷贝?

我不确定这个:

CArray *x[16];
x[0] = *ca;

2 个答案:

答案 0 :(得分:2)

要创建指针数组,您确实应该使用

CArray *x[16];

要从值或引用类型进行分配,请使用&amp;操作者:

x[0] = &ca;

要记住两件事:

  • CArray ca是一个自动对象,因此它的生命周期仅限于变量的范围。
  • 数组x未初始化为任何值,如果依赖空指针,则必须自己初始化它。

答案 1 :(得分:1)

你是对的,x[0] = ca将执行复制分配,这显然不是你想要的。

您在指针示例中已经很近了,但您需要获取ca地址

CArray *x[16];
x[0] = &ca;

但是,您必须非常小心地管理ca的生命周期,以免它过早地超出范围。

您可能希望了解如何使用智能指针。

修改:鉴于您对其他答案的评论

  

&#34;是不是有一个系统使得数组将存在,直到它不再有参考为止? (我来自Python,垃圾收集器!&#34;

是的,就像我之前提到的,你可能想要使用智能指针。如果std::unique_ptr将成为唯一所有者,则可以从x开始:

std::unique_ptr<CArray> x[16];

将创建一个包含16个唯一指针的数组,这些指针在不再被引用后将超出范围。以下是您可以指定的方式:

x[0] = std::make_unique<CArray>();

如果您希望其他对象参与内存的生命周期(也就是说,在多个人完成引用之前内存不会被释放),使用shared_ptr的过程大致相同:

std::shared_ptr<CArray> x[16];
x[0] = std::make_shared<CArray>();

共享指针更易于使用,因为它们很容易被复制,但是您需要花费一些时间和空间开销。