2010-07-04 57 views
1

我有一個類在這裏,這樣定義:幫助識別內存泄露

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僅僅是具有向量嵌套結構的矢量結構。

爲什麼會造成泄漏,我該如何解決?

謝謝

+2

嘗試使用valgrind或類似工具。 – 2010-07-04 04:19:27

+0

我在您發佈的代碼中看不到一個'new',因此很難找到「泄漏」。使用valgrind,但我想你會發現它不是泄漏,操作系統沒有回收內存。 – Stephen 2010-07-04 04:23:44

+0

使用Windows,valgrind是4 linux – jmasterx 2010-07-04 04:26:30

回答

2

如果您刪除了所有內容,根據定義,沒有泄漏。我沒有看到任何未包裝的指針,所有一切都被刪除。因此,你沒有泄漏。

可能的是,OS只是簡單決定離開提供給您的程序內存,無論出於何種原因。 (它沒有「回收」它)或者它可能需要分配4MB的組,所以從12MB到8MB不會留下足夠的所需內存。或...

你正在完全摒棄其他原因;你應該使用真正的內存泄漏工具來查找內存泄漏。

+0

+1到操作系統不回收內存。 'new'從運行時庫管理的單獨池中分配內存,'delete'不會立即將釋放的內存立即返回給操作系統。 – casablanca 2010-07-04 04:36:45

+0

jt正常,它永遠不會回收它? – jmasterx 2010-07-04 04:38:44

+0

@user:是的。爲程序留下內存要簡單得多,因爲進一步的分配並不要求操作系統爲你實際獲得新的內存頁面。如果另一個程序需要內存且操作系統較低,那麼它會從您那裏拿走。 – GManNickG 2010-07-04 06:28:31

0

我會建議使用泄漏檢測工具來確定是否真的有泄漏。例如,對於Windows開發人員,您可以使用Visual Leak Detetor (VLD)

如果你確實有泄漏那麼它可能是不是你認爲它是。

此外,你可能只是錯了,根本沒有泄漏。例如,如果您只是通過類似任務管理器的方式查看統計信息,這並不意味着程序中存在泄漏。運行你的程序的操作系統是一門獨立的野獸,而不是編程語言,你可能會在裏面泄漏。即操作系統可能需要更長時間才能回收釋放的內存。

編輯:

如果你想確保vectorcapacity 0這是很常見的做到以下幾點:

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

視覺泄漏檢測器未檢測到泄漏。 – jmasterx 2010-07-04 05:14:02

+0

然後你可能沒有泄漏。嘗試插入一個泄漏目的(使用新的沒有刪除),然後看看它是否檢測到它,以確保您正確使用它。 – 2010-07-04 06:14:09

+0

它檢測到新東西,我認爲它不是泄漏,而是std :: vector只在〜vector上釋放的事實。但我仍然找不到罪魁禍首.... – jmasterx 2010-07-04 06:21:34

0

如何明確結算SHAPECONTOUR的載體在析構函數OGLSHAPE?如果您仍然有觀察到的泄漏,請使用此&檢查重新運行您的測試。

0

你如何清除這些媒介?嘗試使用在析構函數是這樣的:

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

,做好與其他矢量相同的代碼(UserPoints,DrawingPoints,顏色)。

1

當你分配大量的內存時,當你需要重新分配時,CRT會保留一些內存。您不能使用任務管理器來指示泄漏。

如果你的班級使用像vector這樣的自動清除成員,他們不會泄漏內存。

+0

使用任務管理器進行泄漏檢測並不是最好的主意,但它肯定可以表明您的應用程序出錯了(高CPU使用率,而不是回到相同的內存級別從應用程序啓動之前,等等) – virious 2010-07-04 18:09:38

+0

@virious:由於我在帖子中概述你正在迴應的原因,它實際上沒有任何用處,這是內存動態變化的可怕,可怕的很多。爲了使用TM來證明你有內存泄漏,你必須讓它運行好幾天。 – Puppy 2010-07-04 18:20:51

+0

是的,這當然是對的。 – virious 2010-07-04 18:48:51

0

你使用了哪些調試工具?嘗試一下吧!很簡單!