3

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

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

}
4

5 回答 5

5

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

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


1. 如果您想使用指针,那么建议您应该使用智能指针,例如std::unique_ptr、 或std::shared_ptr

于 2013-07-14T12:45:15.343 回答
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*>.

您也可以使用智能指针。你可以在这里找到一些关于它的文档:http ://www.cplusplus.com/reference/memory/shared_ptr/

编辑:正如评论中所建议的,如果在 处引发异常rsVec.push_back(rs),分配的内存将丢失,这就是为什么智能指针会是更好的解决方案。或者再次使用std::vector<RStatus>

于 2013-07-14T12:46:26.043 回答
1

是的,存在内存泄漏:在向量被销毁后,指向创建结构的指针丢失,并且永远不会释放内存。

除非有人在清除或销毁向量之前delete对每个元素执行 a 。rsVec

于 2013-07-14T12:44:27.203 回答
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尝试删除已删除的对象时出现这种情况

于 2013-07-14T20:15:30.973 回答
0

是的,该代码泄露了RStatus.

它也没有做任何其他事情:可能真正的代码vector被传递给了某个函数,该函数获取了vector的内容。

跟踪内存泄漏通常不是本地问题:理论上,每次使用该指针都必须检查以确定它是否泄漏。诸如“如果我分配它,删除它”和 RAII(包括智能指针)之类的技术试图使其更加本地化,​​因此您可以从不完整的程序中判断是否存在泄漏。

于 2013-07-14T12:49:18.053 回答