如果我们有这样的三个函数(foo,bar和baz)......
foo(bar(), baz())
Run Code Online (Sandbox Code Playgroud)
C++标准是否保证在baz之前评估条形码?
在典型的C++代码中,C++ 17评估顺序保证(P0145)投票的含义是什么?
对于像这样的事情,它有什么变化
i=1;
f(i++, i)
Run Code Online (Sandbox Code Playgroud)
和
std::cout << f() << f() << f() ;
Run Code Online (Sandbox Code Playgroud)
要么
f(g(),h(),j());
Run Code Online (Sandbox Code Playgroud) 这段代码会导致内存泄漏吗?
#include <stdexept>
class MyClass
{
public:
MyClass()
{
throw std::runtime_error("Test");
}
};
int main()
{
try
{
MyClass * myClass = new MyClass;
}
catch (const std::exception & exc)
{
// Memory leak?
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
分配的内存new永远不会被删除.这是内部处理,还是实际的内存泄漏?
我知道从析构函数中抛出异常是不安全的,但是从构造函数中抛出异常是不安全的?
例如,全局声明的对象会发生什么?使用gcc进行快速测试,我得到了中止,是否始终保证?你会用什么解决方案来迎合这种情况?
是否有任何情况下构造函数可以抛出异常而不是留下我们期望的东西.
编辑:我想我应该补充一点,我试图理解在什么情况下我可以获得资源泄漏.看起来明智的做法是手动释放我们在抛出异常之前通过构造获得的资源.我从来不需要在今天之前在构造函数中抛出异常,所以试图理解是否存在任何陷阱.
即这也安全吗?
class P{
public:
P() {
// do stuff...
if (error)
throw exception
}
}
dostuff(P *p){
// do something with P
}
...
try {
dostuff(new P())
} catch(exception) {
}
Run Code Online (Sandbox Code Playgroud)
分配给对象P的内存是否会被释放?
EDIT2:忘了提到在这种特殊情况下,dostuff将对P的引用存储在输出队列中.P实际上是一条消息,dostuff接收消息,将其路由到适当的输出队列并发送它.基本上,一旦dostuff持有它,它会在后来的dostuff内部释放.我想我想把一个autoptr放在P周围并在dostuff后调用autoptr上的释放以防止内存泄漏,这是正确的吗?
如果初始化unique_ptr如下:
std::unique_ptr<Foo> i;
i.reset( new Foo() );
Run Code Online (Sandbox Code Playgroud)
但抛出异常Foo::Foo(),问题是:内存分配会发生什么?unique_ptr如何避免泄露?这是在new运营商内部处理的吗?
当范围退出时,肯定会调用析构函数.由于在返回reset之前不调用调用new Foo(),所以new当异常离开构造函数时,似乎必须通过释放分配的内存来处理它.
这是怎么回事?