如果一个函数的参数需要一个智能指针,而我们在调用该函数时才生成该指针,而其他参数也有函数调用,如果其他参数的函数调用,出现异常,则会使用智能指针内存泄漏,例如:
process(std::shared_ptr<Tool>(new Tool), getParameter());
上述调用,如果getParameter调用出现异常的话,std::shared_ptr<Tool>(new Tool)可能导致内存泄漏。
因为上述std::shared_ptr<Tool>(new Tool)执行分成两部分:
- new Tool
- std::shared_ptr的构造函数
如getParameter()的指针穿插在上述两部之间,并出现异常,则new Tool的内存将被泄漏。
正确的做法,构造完std::shared_ptr之后,再调用:
std::shared_ptr<Tool> mTool(new Tool);
process(mTool, getParameter());
更建议使用std::make_shared,因为std::make_shared的内存分配与std::shared_ptr的构造是在一起的:
process(std::make_shared<Tool>(), getParameter());
网友评论