我正在使用数组和数组数组:
typedef std::valarray<Complex> CArray;
CArray ca;
CArray x[16];
做:
x[0] = ca;
做硬拷贝还是仅仅参考?
如何使CArray x[16]
只是一个包含16个指针的列表,这些指针将在以后分配给现有数组?即如何避免硬拷贝?
我不确定这个:
CArray *x[16];
x[0] = *ca;
答案 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>();
共享指针更易于使用,因为它们很容易被复制,但是您需要花费一些时间和空间开销。