无需在vector <structa *>?</structa *>中删除struct memory

时间:2013-07-14 12:42:28

标签: c++ visual-c++ vector

我看到一些代码如下,但我没有看到任何删除语句,是否有任何内存泄漏问题?

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);

}

5 个答案:

答案 0 :(得分:5)

如果您使用vector<RStatus*>,则必须使用delete,否则会出现内存泄漏。

但是,如果您使用vector<RStatus>,则不必使用delete - 建议 1


1.如果你想使用指针,那么建议你应该使用智能指针,例如std::unique_ptrstd::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_ptrhttp://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尝试删除已删除的对象时出现的情况