【发布时间】:2019-05-27 11:24:02
【问题描述】:
我对关键字new 和& 在特定上下文中的区别有一些疑问。
假设这是我的代码:
struct Base {};
struct Foo : Base {};
struct Storage
{
void save(Base * object) {}
Base * content;
};
int main()
{
Storage s1, s2;
s1.save(new Foo());
s2.save(&Foo());
}
main 执行后,s1 将持有一个指向Foo 类型对象的指针。然而s2 将持有一个指向Base 类型对象的指针。 s2.content 只会指向 Foo 类型的对象,直到 save 方法完成执行。
如有错误请指正:
据我了解new Foo() 创建了一个指向Foo 类型的新对象的指针。另一方面,&Foo() 首先创建一个 Foo 类型的新对象,然后指向它。
那么new Foo() 和&Foo() 之间到底有什么区别呢?显然,两者都为您提供了指向 Foo 类型的现有对象的指针。
为什么new Foo()创建的对象在执行save方法后仍然存在,而&Foo()创建的对象却没有?
可能是&Foo() 创建了一个临时对象,执行保存后该对象将不复存在?如果是,我怎样才能延长通过&Foo() 创建的对象的生命周期以使其存活(至少)直到s2 被销毁?
编辑 1:
非常感谢您的快速回答!我只是在使用 Visual Studio,所以 &Foo() 编译可能是一些微软特有的东西......
【问题讨论】:
-
不能延长&Foo()的寿命
-
最明显的区别是一个编译而另一个不编译...wandbox.org/permlink/qWn4eVLP3HWhIeGt
-
"我怎样才能延长通过 "&Foo()" 创建的对象的寿命...这就是
new Foo()的用途。 -
"然而
s2将持有一个指向Base类型对象的指针。" - 是什么让你这么认为? -
如果您将警告级别提高到至少 4,您会收到“警告 C4238:使用非标准扩展:类右值用作左值”。
标签: c++ reference parameter-passing new-operator