J'ai une classe ici qui est défini comme ceci:vous aider à identifier la mémoire fuites
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);
};
Voici ce que je l'ai fait comme un test. J'ai créé un test global std::vector<OGLSHAPE>
.
Dans la fonction que j'utilisais, j'ai créé
OGLSHAPE t. J'ai ensuite poussé 50 000 copies de t dans le test. J'ai ensuite immédiatement effacé le test et utilisé l'astuce de swap pour vraiment le désallouer. J'ai remarqué que toute la mémoire était correctement libérée comme je m'y attendais. J'ai alors fait la même chose mais avant de pousser t dans test, j'ai poussé un SHAPECONTOUR (que je venais de créer sans rien modifier ou ajouter dans le contour) avant de pousser t dans le test.
Cette fois après le test de libération, 3 mégaoctets de plus ont été alloués. Je l'ai fait encore allouer deux fois plus et maintenant 6MB nous restons. L'utilisation de la mémoire du programme a culminé à 150 Mo et il est descendu à 12 Mo, mais il devrait être à 8,5 Mo. Par conséquent, cela doit être classé comme une fuite de mémoire, même si je ne vois pas comment. Il n'y a rien que je vois qui pourrait faire cela. SHAPECONTOUR est simplement une structure de vecteurs avec une structure imbriquée de vecteurs.
Pourquoi cela causerait-il une fuite, et comment pourrais-je le réparer?
Merci
Essayez valgrind ou un outil similaire. –
Je ne vois pas un seul "nouveau" dans le code que vous avez posté, donc il sera difficile de trouver une "fuite". Utilisez valgrind, mais je pense que vous découvrirez que ce n'est pas une fuite et que l'OS n'a tout simplement pas récupéré la mémoire. – Stephen
En utilisant Windows, valgrind est 4 linux – jmasterx