C++ 在此代码中如何发生内存泄漏

C++ 在此代码中如何发生内存泄漏,c++,memory-leaks,shared-ptr,C++,Memory Leaks,Shared Ptr,我读了一个可能泄漏内存的例子 void foo(std::shared_ptr<int> p, int init) { *p = init; } foo(std::shared_ptr<int>(new int(42)), seed()); // assume seed() returns an int void foo(std::shared_ptr p,int init) { *p=初始值; } foo(std::shared_ptr(newint(42)),s

我读了一个可能泄漏内存的例子

void foo(std::shared_ptr<int> p, int init)
{
  *p = init;
}
foo(std::shared_ptr<int>(new int(42)), seed()); // assume seed() returns an int
void foo(std::shared_ptr p,int init)
{
*p=初始值;
}
foo(std::shared_ptr(newint(42)),seed();//假设seed()返回一个int
文章说,如果
seed()
抛出,那么就会出现内存泄漏。我不明白怎么做

如果先创建
共享ptr
,然后
seed()
抛出异常,则在堆栈展开期间,临时
共享ptr
将被销毁,从而释放内存。如果
seed()


我缺少什么?

执行顺序可以是

auto temp = new int(42);
auto temp2 = seed(); // if throw exception, temp is leaked
auto temp3 = std::shared_ptr<int>(temp);
foo(temp3, temp2);
auto-temp=new int(42);
auto temp2=种子();//如果抛出异常,则会泄漏temp
自动temp3=std::shared_ptr(temp);
foo(temp3、temp2);

您的意思是,在完全计算一个参数值之前,编译器可能会开始计算另一个参数值?为什么会这样?是否难以保证评估顺序?或者至少有一个会在另一个开始之前被完全评估?这仅仅是因为标准确实指定了评估的顺序。如果编译器的指令调度程序发现基本块的管道中有漏洞,它会随意改变来填补这些漏洞,而不考虑表达式边界,只考虑数据依赖性。如果您依赖于函数参数的求值顺序,那么您就破坏了可维护性:维护人员必须问的一个问题是“这个更改安全吗?”,将参数计算从参数列表中提升出来通常是一件好事。如果C++允许依赖关系,答案从“是”变为“好运”。在这种情况下,没有理由阻碍优化器。这将解释为什么=>简短回答:
newint(42)
可以在执行
seed()
之前执行,并且在其结果绑定到函数参数之前执行。