gpt4 book ai didi

c++ - 这种资源泄漏是由可能的评估顺序提供的还是 Scott Meyers 错了?

转载 作者:太空狗 更新时间:2023-10-29 20:11:11 27 4
gpt4 key购买 nike

我正在阅读 std::shared_ptrEffective Modern C++14 Scott Meyers 的书。这是一段代码,作者说其中可能存在资源泄漏:

int computePriority(); // this function always throw an exception
// ...
processWidget(std::shared_ptr<Widget>(new Widget), // (S.M): potentital
computePriority()); // resource
// leak

Scott MeyerscomputePriority()函数可以在 new Widget 之间调用和 std::shared_ptr<Widget>(expr)表达式被评估将导致由 new 引起的内存泄漏.如果 new Widget 不应该有一个序列点可以保证然后计算表达式 std::shared_ptr<Widget>(expr)接下来会评估吗?我考虑这个是因为在我看来这是正确的:序列点在 std::shared_ptr<Widget>(expr) 中。将在没有排序的情况下评估它的所有参数(子表达式),并使共享指针准备就绪,然后执行其他操作(在没有排序的情况下评估其他参数)。只是如果这是不真实的并且Scott Meyers是对的(我仍然相信他,显然), 这种行为不会不正确吗?

是否有一条规则可以解释为什么这是可能的?我不擅长序列点,但告诉我它们的人说这应该是有效的。

最佳答案

顺序并不意味着即时。
(我的起床顺序是在我上类之前,即使我在中间穿好衣服吃早餐也是如此。)

参数的求值不是相对于彼此排序的。

也不是一个参数必须在另一个参数之前被完全评估的情况,无论顺序如何。

也就是说,分配在 shared_ptr 构造函数之前排序,但两者都没有相对于另一个参数排序,并且不能保证在分配和构造函数调用之间没有任何事情发生。

关于c++ - 这种资源泄漏是由可能的评估顺序提供的还是 Scott Meyers 错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34510570/

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