gpt4 book ai didi

c++ - 表达式 `new T` 的计算结果是右值还是左值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:52 25 4
gpt4 key购买 nike

我目前正在阅读这篇教程/右值引用的解释:

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));
}

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

编辑:澄清一下,我知道这个例子中不会有内存泄漏。我的意思是,如果指针值未被使用,我们将无法访问构造的 T 对象,因此我们会发生内存泄漏。

最佳答案

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

new 给你一个指针 rvalue:new int = nullptr; 编译失败并出现关于需要 lvalue .

取消引用该指针会给你一个 左值:*(new int) = 5; 将编译(当然,这个天真的语句也会泄漏内存,因为指针丢失了) .

复制构造函数接受一个引用,所以如果你有指向对象的指针,你需要取消引用它。

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

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

关于c++ - 表达式 `new T` 的计算结果是右值还是左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26044347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com