在堆栈上抛出对象的异常,用新的mem泄漏?

Net*_*zen 2 c++ exception

这样做是一个错误:

if(some_error)
  throw Cat("Minoo");
Run Code Online (Sandbox Code Playgroud)

Cat是一个班级.

然后在一些其他函数调用抛出异常的方法...

我会:

catch(const Cat &c)
{ 
}
Run Code Online (Sandbox Code Playgroud)

如果它无效,我是否使用新的Cat("Minoo");

这会导致内存泄漏吗?

GMa*_*ckG 6

你现在拥有的是每个人应该做的事情,大多数人都应该这样做.抛出对象本身并通过const-reference捕获.

投掷指针有毛茸茸的问题,例如"谁删除它?".

更多信息在这里.


小智 6

1)无效?不,这正是你应该做的:投掷一个物体.throw语句中的对象可能在堆栈中,但在抛出时会被复制.比较,例如,执行返回Cat("Minoo")的效果;

2)抛出指针会导致指向对象泄漏吗?是的,如果对象是在堆上分配的,除非您安排删除它.但是你应该避免抛出指针作为一般规则.


Tyl*_*nry 5

您编写的内容完全有效,通常最好在堆上分配异常对象.

如果你要使用new,除非你在捕获异常的异常处理程序中删除了对象,否则你当然会得到内存泄漏.

C++ faq中的这个问题(以及后两个问题)解决了这个问题.