我有一个关于在c ++中分配的问题。 我有这段代码:
vector<unsigned char> &v = *new vector<unsigned char>();
现在问题是,取消引用对象并将其直接分配给引用通常是一个好主意吗?
在我看来,这样可以更容易地使用对象,因为现在你可以这样做:
v.push_back('a');
v[0];
而不是
v->push_back('a');
(*v)[0];
最后,我可以做到
delete &v;
释放我的堆
仅仅因为(相同)好的答案的数量: 我知道我可以使用堆栈变量 但就我而言,我需要它在堆上! 但是使用堆或堆栈变量的问题是另一个问题。
所以我保持这个例子简单,特别是没有问我是否应该分配变量。
答案 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];
}
...
据我所知,没有必要在堆中分配矢量。
您应该阅读堆和堆栈内存: