0

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

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

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

在我看来,这使得使用对象更容易,因为现在你可以这样做:

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

代替

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

最后,我能做到

delete &v;

释放我的堆

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

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

4

4 回答 4

5

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

一点都不。

如果您不需要动态分配,因为对象只需要持续与当前范围一样长,那么请改为使用自动变量:

vector<unsigned char> v;

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

于 2013-02-01T13:59:43.447 回答
2

这纯粹是一个风格问题。我工作过的所有地方都没有使用过这个约定,所以它可能会影响你组织中的新人,但它一个有效的约定。

它应该是何时使用指针以及何时使用引用的更大定义的一部分。(你会发现其中有很多变化;我在不同的公司中至少使用了三种不同的约定。)

于 2013-02-01T14:34:56.193 回答
0

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

于 2013-02-01T13:59:14.487 回答
0

你可以这样做:

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

据我所知,不需要在堆中分配向量。

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

于 2013-02-01T14:03:31.580 回答