"new Foo()"和"&Foo()"之间的区别作为参数

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允许这样做.