我看到一些代码如下,但我没有看到任何删除语句,是否有任何内存泄漏问题?
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);
}
答案 0 :(得分:5)
如果您使用vector<RStatus*>
,则必须使用delete
,否则会出现内存泄漏。
但是,如果您使用vector<RStatus>
,则不必使用delete
- 建议 1 。
1.如果你想使用指针,那么建议你应该使用智能指针,例如std::unique_ptr
或std::shared_ptr
。
答案 1 :(得分:2)
是的,你应该释放分配的内存:
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/
编辑:正如评论中所建议的,如果在rsVec.push_back(rs)
抛出异常,分配的内存将会丢失,这就是为什么智能指针会成为更好的解决方案的原因。或者,再次使用std::vector<RStatus>
。
答案 2 :(得分:1)
是的,存在内存泄漏:在向量被破坏后,指向已创建结构的指针将丢失,并且永远不会释放内存。
除非有人在清除或销毁向量之前为delete
的每个元素执行rsVec
。
答案 3 :(得分:0)
是的,该代码泄漏了RStatus
。
它也没有做任何其他事情:可能真正的代码vector
被传递给一些需要vector
内容的函数。
追踪内存泄漏通常不是本地问题:理论上,每次使用该指针都必须检查它是否泄漏。类似于&#39;如果我分配它,删除它&#39;和RAII(包括智能指针)尝试使其更加本地化,因此您可以从不完整的程序中判断是否存在泄漏。
答案 4 :(得分:0)
如果你不想打扰自己删除已分配的对象,请使用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
尝试删除已删除的对象时出现的情况