不需要删除向量<结构A*>



我看到了下面的一些代码,但没有看到任何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_ptrstd::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试图删除已经删除的对象时出现这种情况

相关内容

  • 没有找到相关文章

最新更新