Dom*_* P. 16 c++ reference parameter-passing new-operator
关于关键字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());
}
Run Code Online (Sandbox Code Playgroud)
执行main之后,s1将持有指向类型对象的指针Foo.然而,s2将保持指向类型对象的指针Base.在save方法完成执行之前,它s2.content只会指向一个类型的对象Foo.
如果我错了,请纠正我:
据我所知,new Foo()创建一个指向新类型对象的指针Foo.&Foo()另一方面,首先创建一个类型的新对象,Foo然后指向它.
究竟是什么区别new Foo()和&Foo()呢?显然,它们都会为您提供指向现有类型对象的指针Foo.
为什么new Foo()在执行save方法后通过persist 创建对象,而通过创建的对象&Foo()却没有?
可能是&Foo()创建一个临时对象,在执行save之后它将不复存在?如果是的话,我怎样才能延长通过&Foo()它创建的对象的生命(至少)直到毁灭s2?
编辑1:非常感谢您的快速解答!我只是使用Visual Studio,所以也许&Foo()编译是一些微软特定的东西......
Som*_*ken 22
那么"
new Foo()"和"&Foo()" 之间到底有什么区别?显然,它们都会为您提供指向Foo类型的现有对象的指针.为什么"
new Foo()" 创建的对象在执行save方法后仍然存在,而通过"&Foo()" 创建的对象不存在?
new Foo()new Foo();
Run Code Online (Sandbox Code Playgroud)
这将创建一个动态分配的 Foo对象,并返回指向该对象的指针.动态分配的对象将持续存在,直到程序员明确删除它们为止:
Foo* foo = new Foo();
delete foo; // delete the object.
Run Code Online (Sandbox Code Playgroud)
&Foo()Foo();
Run Code Online (Sandbox Code Playgroud)
这将Foo使用自动存储创建一个对象.这意味着删除对象时的生命周期取决于对象所在的范围:
{
Foo foo{}; // foo lives in automatic storage.
} // end of scope, foo dies
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您正在创建一个新Foo对象,并且您将此匿名对象的地址传递给Storage::save.该对象将在完整表达式结束时销毁.这基本上意味着在s2.save()返回之后,您的对象将被销毁,并且指向它的指针s2将悬空并且取消引用它将是未定义的行为.
如果是,我怎样才能延长通过"&Foo()"创建的对象的生命,使其生存(至少)直到s2被破坏?
你不能.你可能想要一个智能指针,如std::unique_ptr.
请注意,获取临时地址是非标准的,因此此代码不符合要求.您的编译器可能正在使用扩展来允许它.众所周知,MSVC允许这样做.
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |