我看到了下面的一些代码,但没有看到任何delete语句,是否存在内存泄漏问题?
struct RStatus
{
int fid;
int status;
};
void Foo()
{
vector<RStatus*> rsVec;
RStatus* rs = null;
rs = new RStatus(); // memory allocated here!
rs->fid = 0
rs->status = 0;
rsVec.push_back(rs);
}
如果使用vector<RStatus*>
,则必须使用delete
,否则将出现内存泄漏。
但是,如果使用vector<RStatus>
,则不必使用delete
—这是推荐的1。
1.如果你想使用指针,那么建议你应该使用智能指针,如std::unique_ptr
或std::shared_ptr
是的,您应该释放分配的内存:
struct RStatus
{
int fid;
int status;
};
void Foo()
{
vector<RStatus*> rsVec;
RStatus* rs = null;
rs = new RStatus(); // memory allocated here!
rs->fid = 0
rs->status = 0;
rsVec.push_back(rs);
// free :
unsigned int size = rsVec.size();
for (unsigned int i = 0; i < size; i++ )
delete rsVec[i]; // delete because you used new
}
如果你不这样做,所有的内存将永远不会在矢量破坏时释放。
我建议你用std::vector<RStatus>
而不是std::vector<RStatus*>
。
您也可以使用智能ptr。你可以在这里找到一些关于它的文档:http://www.cplusplus.com/reference/memory/shared_ptr/
EDIT:正如注释中所建议的,如果在rsVec.push_back(rs)
处引发异常,则分配的内存将丢失,这就是为什么智能指针是更好的解决方案。或者再次使用std::vector<RStatus>
。
是的,存在内存泄漏:向量被破坏后,指向所创建结构的指针丢失,内存永远不会释放。
除非有人在清除或销毁矢量之前对rsVec
的每个元素执行delete
。
RStatus
。
它也不做任何其他事情:可能真实代码的vector
被传递给某个函数,该函数接受vector
的内容。
追踪内存泄漏通常不是一个局部问题:理论上,每次使用该指针都必须进行检查,以确定它是否泄漏。像"如果我分配它,就删除它"和RAII(包括智能指针)这样的技术试图使它更本地化,这样你就可以从不完整的程序中判断是否存在泄漏。
如果您不想为删除分配的对象而烦恼,请使用boost::shared_ptr
。http://www.boost.org/doc/libs/1_54_0/libs/smart_ptr/shared_ptr.htm
struct RStatus
{
int fid;
int status;
};
void Foo()
{
vector<shared_ptr<RStatus> > rsVec;
shared_ptr<RStatus> rs = shared_ptr<RStatus>(); // empty shared_ptr
rs.reset(new RStatus()); // memory allocated here!
rs->fid = 0
rs->status = 0;
rsVec.push_back(rs); // shared_ptr is copied
}// vector is destroyed and shared_ptrs also
但是要注意不要同时使用shared_ptr
和普通的原始指针,以避免shared_ptr
试图删除已经删除的对象时出现这种情况