2014-09-23 16 views
0

我一直在做一個簡單的光線跟蹤器,我遇到了內存不足的問題。我爲Visual Studio下載了Visual Leak Detector,它告訴我下面的函數會導致內存泄漏。我不知道爲什麼這些會被認爲不過泄漏:創建和使用這裏顯示的複印功能後C++這些是否構成內存泄漏?

Point* Point::copy() { 

    Point* result = new Point(x, y, z); 

    return result; 
} 

Point* Point::crossProduct(Point* other) { 

    double crossX = y*(*other).getZ() - z*(*other).getY(); 
    double crossY = z*(*other).getX() - x*(*other).getZ(); 
    double crossZ = x*(*other).getY() - y*(*other).getX(); 

    Point* cross = new Point(crossX, crossY, crossZ); 

    return cross; 
} 

注意,我只發現了約拷貝構造函數。如果我要重做項目,我會使用複製構造函數。現在,當我使用函數時,我確定在我使用的任何變量上調用「delete」。例如:

Point* n = AB.crossProduct(&AC); 
... 
delete n; 

我錯了,認爲這應該處理任何內存泄漏?視覺泄漏檢測器只是無法識別泄漏已被處理,因爲它在一個單獨的文件?

+0

使用智能指針,以避免內存泄漏。儘管你的假設是正確的。 – 2014-09-23 03:03:01

+3

爲什麼你使用'new'?您可以通過返回像這些值這樣的簡單對象來修復可能存在的任何泄漏(並提高性能,可能數量巨大)。 – 2014-09-23 03:04:05

+1

重寫你的代碼以不使用'new'。 – 2014-09-23 03:45:07

回答

4

規則是:
每個動態內存分配應該有相應的釋放。

除非遵循此規則,否則最終會發生內存泄漏。至少任何內存泄漏檢測工具都會檢測到它們。可能會有內存分配,這些內存分配永遠不會被釋放,直到程序生命週期結束,但這些實例將非常少。除非你真的很瞭解這些概念,否則你不應該涉獵這些概念。

至於獲得內存分配/釋放的最簡單方法,這個權利只是簡單地使用Smart pointers

注意:根據您顯示的代碼,您的處理似乎是正確的。

+0

現在查找智能點。感謝您的推薦! – 2014-09-23 03:04:56

1

不是手動管理內存,而是使用smart pointers。這樣,所有對象都會自動釋放,並且不必擔心內存泄漏。

5

爲什麼不只是按值返回,並通過const引用?

Point Point::copy() 
{ 
    return Point(x, y, z); 
} 

Point Point::crossProduct(const Point& other) 
{ 
    double crossX = y * other.getZ() - z * other.getY(); 
    double crossY = z * other.getX() - x * other.getZ(); 
    double crossZ = x * other.getY() - y * other.getX(); 

    return Point(crossX, crossY, crossZ); 
} 

當然你copy功能僅僅是一個窮人的拷貝構造函數/賦值運算符,所以使用這些來代替:

Point::Point(const Point& other) 
    : x(other.x) 
    , y(other.y) 
    , z(other.z) 
{ 
} 

Point& Point::operator=(const Point& other) 
{ 
    x = other.x; 
    y = other.y; 
    z = other.z; 
    return *this; 
} 
+2

當然,這些複製/分配功能與隱式生成的功能相同,所以不要自己實際編寫它們。 – 2014-09-23 06:30:22