为什么不使用以下内容:
struct Foo
{
int x;
};
int main()
{
Foo &foo = *new Foo();
foo.x = 7;
std::cout << foo.x << std::endl;
delete &foo;
}
毕竟,必须尽可能使用引用,并且通过这种方法,一旦我们最初取消引用,我们就不必担心再次忘记它。有什么缺点?
编辑:
我知道operator ->
,忘记了我的意思
int &n = *new int;
n = 7;
int *m = new int;
*m = 7; //here you can forget it
答案 0 :(得分:3)
你会有内存泄漏。你必须在函数结束时做这样的事情:
delete &foo;
这是一个坏主意。
答案 1 :(得分:2)
您可以结合使用智能指针进行此操作。
std::unique_ptr<Foo> p(new Foo);
Foo &foo = *p;
//...
然后,在范围结束时将为您正确删除内存。
答案 2 :(得分:1)
这种方法没有明显的缺点。但是,如果必须使用动态分配参考,即T& t = *new T;
,则应重新考虑设计
为什么?因为,
“在声明时必须初始化引用。”
这意味着,您无法执行T& t;
,然后为其分配一些内存
如下声明:
T& t = *new T; // (1) costly heap allocation (2) exception handling (3) need cleaning
变得轻而易举地替代:
T t; // (1) cheaper auto allocation (2) no exception (2) no need to clean
因此,即使您可以动态分配引用,也几乎不需要它们。
答案 3 :(得分:0)
回复:“必须尽可能使用参考”?这个(坏的)建议来自哪里?
Foo foo;
foo.x = 7;
std::cout << foo.x << std::endl;
没有指针,没有引用,没有免费商店,没有delete
。
但是当你从免费商店分配时,你会得到一个指向数据对象的指针。除非你绝对必须这样做,否则不要把它变成参考。即使这样,也不要这样做。