c++ 分配 *new Object() 来引用

c++ allocate *new Object() to reference

本文关键字:引用 Object 分配 new c++      更新时间:2023-10-16

我有一个关于在 c++ 中分配的问题。我有这个代码:

vector<unsigned char> &v = *new vector<unsigned char>();

现在的问题是,取消引用对象并将其直接分配给引用通常是一个好主意吗?

在我看来,这使得使用该对象变得更加容易,因为现在您可以执行以下操作:

v.push_back('a');
v[0];

而不是

v->push_back('a');
(*v)[0];

终于,我能做到

delete &v;

释放我的堆

只是因为(相同)好答案的数量:我知道我可以使用堆栈变量但就我而言,我需要它在堆上!但是使用堆或堆栈变量的问题则是另一个问题。

所以我保持这个例子简单,特别是没有问我是否应该分配变量。

取消引用对象并将其直接分配给引用通常是一个好主意吗?

不,一点也不。

如果你不需要动态分配,因为对象只需要持续到当前作用域的时间,那么创建一个自动变量:

vector<unsigned char> v;

如果您确实需要一个动态对象,那么尝试伪装它是忘记它需要删除的好方法。最好的办法是使用智能指针,这样您根本不需要记住删除它;否则,请使用指针。

这纯粹是一个风格问题。 我工作过的地方都没有使用了这个约定,所以它可能会改变新人的路线您的组织,但这是一个有效的约定。

它应该是何时使用时更大定义的一部分指针,以及何时使用引用。 (你会发现很多这方面的变化;我至少用过三种不同的不同公司的惯例。

将堆对象主要存储在引用变量中不是一个好主意,因为Joachim Pileborg在他的评论中给出了原因。您最终需要删除对象,最好通过指针变量来完成(在引用中,人们总是会想知道实际对象是否位于其他地方)。

你可以

这样做:

...
{
    vector<unsigned char> v; // this allocates the vector in the stack
    v.push_back('a');
    v[0];
} 
...

据我所知,没有必要在堆中分配向量。

您应该阅读有关堆和堆栈内存的信息:

  • 堆栈和堆是什么以及在哪里?

  • 堆叠
  • 、静态和堆C++