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

时间:2013-02-01 13:51:56

标签: c++ reference allocation

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

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

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

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

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

而不是

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

最后,我可以做到

delete &v;

释放我的堆

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

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

4 个答案:

答案 0 :(得分:5)

  

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

不,完全没有。

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

vector<unsigned char> v;

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

答案 1 :(得分:2)

这纯粹是一种风格问题。我没有工作过的地方 已经使用过这个惯例,所以它可能会让新人们失望 您的组织,但它 是一个有效的约定。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

你可以这样做:

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

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

您应该阅读堆和堆栈内存: