将本地对象转换为指针,而不复制数据?

时间:2011-10-28 15:05:56

标签: c++ pointers

我有一个 cnList 类,它存储了灵活数量的项目。此列表必须稍后转换为 cnArray 对象。列表类已经实现了方法cnArray cnList::toArray() const

但正如您所看到的,它返回一个对象,而不是引用或指针。但是在将列表转换为数组之后我要做的就是存储这个数组以供以后在类成员中使用,这意味着,我需要有一个指向 cnArray 对象的指针。 p>

现在,实际问题是,简单地使用数组地址不是一个选项,因为它在我当前进入的方法之后被释放,结束。

我可以以某种方式将此对象“转换”为指针并且该对象不再被释放吗? 当然,我可以将对象数组中的所有条目复制到指向数组,但这不是我想要的,因为它效率不高。

我知道我可以在 cnList 中实现一个返回指向 cnArray 对象的指针的方法,但是我想知道是否有围绕着这个。

4 个答案:

答案 0 :(得分:4)

您可以从堆中分配一个新的cnArray,它是根据toArray的返回值构造的。如果你做得对,Return Value Optimization将允许编译器优化冗余副本:

cnArray *p = new cnArray(list.toArray());

要查看g ++的RVO将删除副本,请参阅http://ideone.com/loXAT

答案 1 :(得分:0)

指针可以是尊重并且像普通本地人一样使用。问题是您不使用堆对象将自动转换为堆分配的对象。不过我建议使用shared_ptr。

cnArray* Ptr = new cnArray();
(*Ptr) = cnList::toArray();

答案 2 :(得分:0)

cnList::toArray()中,您可以动态分配cnArray* obj,将cnList对象转换为obj,然后返回obj。由于您将原始(或智能)指针传回,因此当它超出范围时将不会被释放。

答案 3 :(得分:0)

cnList被复制到新的cnArray。 cnArray::ToList函数可能已被编写为接受现有cnArray的引用或指针,但事实并非如此。如果你可以改变界面,你应该考虑这个。

返回的cnArray是一个本地对象,当它超出范围时会被销毁,你似乎明白这一点。您唯一的选择是将其另一个副本复制到对象的成员变量中。

某些C ++编译器会执行copy elision,以防止生成多余的副本。不是将返回值赋给临时值,而是将其直接分配给成员变量。