表达式"new T"是否评估为右值或左值?

ela*_*lhm 5 c++ rvalue new-operator lvalue

我目前正在阅读本教程/ rvalue参考的解释:

http://thbecker.net/articles/rvalue_references/section_07.html

在第二段到最后一段中,作者提到" 工厂主体中T的复制构造函数的论证是一个左值 ".他所指的代码是这样的:

template<typename T, typename Arg> 
shared_ptr<T> factory(Arg const & arg)
{ 
  return shared_ptr<T>(new T(arg));
}
Run Code Online (Sandbox Code Playgroud)

我意识到new T(arg)在堆上构造一个T对象,但是返回的值不是一个临时指针值,如果不使用它会丢失(导致内存泄漏),因此是一个rvalue?

编辑:只是为了澄清,我知道在这个例子中将没有内存泄漏.我的意思是,如果指针值没有被使用,我们将无法访问构造的T对象,因此我们会得到内存泄漏.

hyd*_*yde 6

简短的回答,我相信有人会写更长的答案,但是:

new给你一个指针右值new int = nullptr;无法编译并出现需要左值的错误。

取消引用该指针会为您提供一个左值*(new int) = 5;将编译(当然,这个简单的语句也会泄漏内存,因为指针丢失了)。

复制构造函数需要一个引用,因此如果您有指向对象的指针,则需要取消引用它。

如果丢失了指针,则无法删除它,因此它不会被破坏,堆内存也不会被释放(直到程序退出并将内存返回给操作系统)。

如果您将指针指向可以拥有它的所有权的其他对象(例如 a shared_ptr),那么您不会丢失该指针。另一个对象将根据其语义删除它,最迟当另一个对象(或最后一个对象,在共享所有权的情况下,如 with shared_ptr)本身被破坏时。