我这里的课程定义如下:
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 ¤tcontour);
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只是一个具有嵌套矢量结构的向量结构。
为什么会导致泄漏?我该如何解决?
由于
答案 0 :(得分:2)
如果您删除了所有内容,根据定义,没有泄漏。我没有看到任何未解开的指针,所有内容都被删除了。因此,您没有泄漏。
可能,操作系统只是决定将该内存留给您的程序,无论出于何种原因。 (它没有“回收”它。)或者它可能需要分配4MB的组,因此从12MB到8MB不会留下足够的所需内存。还是......
你完全切断了其他原因;你应该使用真正的内存泄漏工具来查找内存泄漏。
答案 1 :(得分:1)
当您分配大块内存时,CRT会在您需要再次分配时保留一些内存。您无法使用任务管理器来指示泄漏。
如果你的班级使用像矢量这样的自清除成员,它们就不会泄漏内存。
答案 2 :(得分:0)
我建议使用泄漏检测工具来确定您是否真的有泄漏。例如,对于Windows dev,您可以使用Visual Leak Detetor (VLD)。
如果确实有泄漏,那么它可能不在您认为的位置。
你也可能错了,因为根本没有泄漏。例如,如果您通过任务管理器之类的方式查看统计数据,这并不意味着您的程序存在泄漏。运行程序的操作系统是一个独立的野兽,而不是你可能在其中泄漏的编程语言。即操作系统可能需要更长的时间来回收释放的内存。
修改强>
如果您想确保vector
有capacity
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)
您使用了哪些调试工具?尝试删除!这很简单!