帮助识别内存泄漏

时间:2010-07-04 04:18:32

标签: c++ memory-management vector

我这里的课程定义如下:

struct USERFPOINT
{
    POINTFLOAT UserPoint;
    POINTFLOAT LeftHandle;
    POINTFLOAT RightHandle;
    bool isBezier;
};

struct SHAPEOUTLINE {
    GLuint OutlineVBO;
    int OutlineSize;
    int OutlineWidth;
    ARGBCOLORF OutlineColor;
};

struct SHAPECONTOUR{

    std::vector<USERFPOINT> UserPoints;
    std::vector<std::vector<GLdouble>> DrawingPoints;
    SHAPEOUTLINE Outline;

};
struct SHAPEGRADIENT{
    GLuint TextureId;
    bool IsParent;
    bool active;
    int type;
    std::vector<ARGBCOLORF> colors;
};

struct SHAPEDIMENSIONS {
    POINTFLOAT Dimensions;
    POINTFLOAT minima;
    POINTFLOAT maxima;
};

class OGLSHAPE
{
private:
    int WindingRule;
    GLuint TextureCoordsVBOInt;
    GLuint ObjectVBOInt;
    UINT ObjectVBOCount;
    UINT TextureCoordsVBOCount;
    SHAPEGRADIENT Gradient;
    SHAPEDIMENSIONS Dimensions;
    void SetCubicBezier(USERFPOINT &a,USERFPOINT &b, int &currentcontour);

    void GenerateLinePoly(const std::vector<std::vector<GLdouble> > &input, int width);
public:
    std::string Name;
    ARGBCOLORF MainShapeColor;
    std::vector<SHAPECONTOUR> Contour;
    OGLSHAPE(void);

    void UpdateShape();
    void SetMainColor(float r, float g, float b, float a);
    void SetOutlineColor( float r, float g, float b, float a,int contour );
    void SetWindingRule(int rule);
    void Render();
    void Init();
    void DeInit();
    ~OGLSHAPE(void);
};

这是我作为测试所做的。我创建了一个全局std::vector<OGLSHAPE>测试。

在我使用的功能中,我创建了

OGLSHAPE t。

然后我将50,000份t推入测试中。

然后我立即清除测试并使用交换技巧真正解除分配。

我注意到所有内存都已正常释放,正如我所料。

然后我做了同样的事情,但是在推进测试之前,我推了一个SHAPECONTOUR(我刚刚创建的,没有修改或添加任何东西到轮廓中),然后推进测试。

此次清理测试后,已分配了3兆字节。我做了它再次分配两倍,现在剩下6MB。该程序的内存使用率达到150MB,最低可降至12MB,但应该达到8.5MB。因此,这必须被归类为内存泄漏,虽然我没有看到如何。我看到没有什么可以做到这一点。 SHAPECONTOUR只是一个具有嵌套矢量结构的向量结构。

为什么会导致泄漏?我该如何解决?

由于

6 个答案:

答案 0 :(得分:2)

如果您删除了所有内容,根据定义,没有泄漏。我没有看到任何未解开的指针,所有内容都被删除了。因此,您没有泄漏。

可能,操作系统只是决定将该内存留给您的程序,无论出于何种原因。 (它没有“回收”它。)或者它可能需要分配4MB的组,因此从12MB到8MB不会留下足够的所需内存。还是......

你完全切断了其他原因;你应该使用真正的内存泄漏工具来查找内存泄漏。

答案 1 :(得分:1)

当您分配大块内存时,CRT会在您需要再次分配时保留一些内存。您无法使用任务管理器来指示泄漏。

如果你的班级使用像矢量这样的自清除成员,它们就不会泄漏内存。

答案 2 :(得分:0)

我建议使用泄漏检测工具来确定您是否真的有泄漏。例如,对于Windows dev,您可以使用Visual Leak Detetor (VLD)

如果确实有泄漏,那么它可能不在您认为的位置。

你也可能错了,因为根本没有泄漏。例如,如果您通过任务管理器之类的方式查看统计数据,这并不意味着您的程序存在泄漏。运行程序的操作系统是一个独立的野兽,而不是你可能在其中泄漏的编程语言。即操作系统可能需要更长的时间来回收释放的内存。

修改

如果您想确保vectorcapacity 0,则执行以下操作非常常见:

v.swap(std::vector<char>());
assert(v.capacity() == 0);

答案 3 :(得分:0)

如何在OGLSHAPE的析构函数中明确清除SHAPECONTOUR的向量?用这个&amp; amp;重新运行你的测试检查您是否仍有观察到的泄漏。

答案 4 :(得分:0)

你是如何清除这些载体的?尝试在析构函数中使用这样的东西:

std::vector<SHAPECONTOUR>().swap(Contour);

使用代码中的其他向量(UserPoints,DrawingPoints,colors)执行相同操作。

答案 5 :(得分:0)

您使用了哪些调试工具?尝试删除!这很简单!