c++ - “new Foo()”和“&Foo()”作为参数的区别
问题描述
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()
和then到底有什么区别&Foo()
?显然,两者都给你一个指向现有类型对象的指针Foo
。
为什么new Foo()
执行 save 方法后创建的对象会持久化,而通过创建的对象&Foo()
不会?
可能是&Foo()
创建了一个临时对象,执行保存后该对象将不复存在?如果是,我怎样才能延长通过创建的对象的生命,&Foo()
使其(至少)存活,直到销毁s2
?
编辑1:非常感谢您的快速回答!我只是在使用 Visual Studio,所以也许&Foo()
编译是一些微软特定的东西......
解决方案
new Foo()
那么“ ”和“ ”到底有什么区别&Foo()
呢?显然,两者都为您提供了指向 Foo 类型的现有对象的指针。为什么由“
new Foo()
”创建的对象在执行保存方法后仍然存在,而通过“&Foo()
”创建的对象不存在?
new Foo()
new Foo();
这将创建一个动态分配的 Foo
对象并返回一个指向该对象的指针。动态分配的对象将一直存在,直到它们被程序员明确删除:
Foo* foo = new Foo();
delete foo; // delete the object.
&Foo()
Foo();
这使用自动存储创建一个Foo
对象。这意味着它的生命周期,当对象被删除时,由对象所在的范围决定:
{
Foo foo{}; // foo lives in automatic storage.
} // end of scope, foo dies
在您的情况下,您正在创建一个新Foo
对象,并且将此匿名对象的地址传递给Storage::save
. 该对象将在完整表达式结束时被销毁。这基本上意味着在s2.save()
返回后您的对象将被销毁,并且指向它的指针s2
将悬空并且取消引用它将是未定义的行为。
如果是,我怎样才能延长通过“&Foo()”创建的对象的生命周期以使其存活(至少)直到 s2 被破坏?
你不能。您可能需要一个智能指针,例如std::unique_ptr
.
请注意,获取临时地址是非标准的,因此此代码一开始就不合规。您的编译器可能正在使用扩展来允许它。MSVC 以允许这样做而闻名。
推荐阅读
- datatable - 需要在不相互影响的两个不同页面中覆盖 ngx 数据表的样式
- php - php 验证金额
- css - CSS 指针事件 IE10 和 IE11 旧版本
- html - RenderBody() 导致异常(不能直接请求,因为它调用了“RenderBody”方法。)
- safari - Safari 12 实时编辑样式表不起作用
- python - 从视图函数中返回 2 个元素的问题
- lucene - 是否可以在 lucene 中转义多个字符?
- android - Gradle Plugin 3.2.0 with databinding,无法解析包名
- javascript - 保存带有图像的元数据,从 html5 画布中检索
- html - 悬停时是否可以显示div?为什么我在 css 中的代码不起作用?