2012-03-05 54 views
1

我想知道確定下面的代碼是否會產生內存泄漏的最好方法,因爲我知道在使用完內存時必須釋放內存,但同時這個數組或指針指向的是當函數返回時超出範圍,那麼我是否釋放它並不重要?這段代碼是生成內存泄漏還是乾淨?

但是,在這種特殊情況下,我不能在不中斷堆ATLEAST根據在Visual Studio 2010

微軟調試器,並學習如何最好地處理這個請你描述檢查內存的方式釋放內存泄漏。

在此先感謝

#include <iostream> 
#include <algorithm> 
#include <cmath> 

using namespace std; 
int sieve(int n) 
{ 
    int *a = (int *) malloc(sizeof(int) * n); 
    int max = floor(sqrt((double)n)); 
    int p = 2; 
    memset(a,0,sizeof(int) * n); 
    while(p<=max) 
    { 
    for(int i = 2 * p; i <= n; i+= p) 
     a[i] = 1; 
    while(a[++p]) /* Empty */ ; 
    } 
    while(a[n]) n--; 
    /* free(a); */ // free our array as we are done with it. but it generate a heap error 
    return n; 
} 
int main(void) 
{ 
    cout << sieve(100) << endl; 
    system("pause"); 
    return 0; 
} 
+1

你有越界訪問,因此可能是你釋放錯誤 – Anycorn 2012-03-05 11:17:18

+0

沒有時間去調試這個給你,但Valgrind的說,有一個內存讀/寫錯誤 – kfmfe04 2012-03-05 11:18:21

+0

你可能想看看'alloca' - HTTP:/ /www.mkssoftware.com/docs/man3/alloca.3.asp – sje397 2012-03-05 11:20:26

回答

3

您的程序中存在內存泄漏,因爲您沒有釋放分配的內存。 在這裏使用「free」,因爲如果您計劃使用「new」,然後使用「delete」運算符,則使用malloc和incase。 嘗試在返回語句之前釋放內存。 您還可以使用valgrind工具來查找程序中的內存泄漏 請檢查此url以獲取更多信息。

此工具將幫助您找出程序中的內存泄漏。

+0

我會感謝你在回答我的問題時所使用的工具,以便進一步瞭解更多信息,而這一切都可以實現,我知道上面的例子很糟糕,包括C++和純C,它也可以用純C編寫,但它是一個快速測試,看看我是否理解它的大部分。 – 2012-03-05 19:22:59

2

是的,你的程序,因爲它主張將導致內存泄漏。

在一般情況下,如果要動態地分配存儲器(通過在C malloc,或new在C++),並在不使用智能指針,則需要釋放分別使用freedelete存儲器。

在您的特定測試程序中,它在調用sieve()方法後立即退出,這意味着分配的內存將自動被操作系統解除分配。

另外請注意,您似乎C++被寫C代碼:

  • malloc是C的方式來分配內存。如果您必須使用原始指針,則應該在C++中使用new
  • 更好的是,使用標準庫容器,如vector,它會自動爲您管理內存。
3

此行可能是你錯誤的原因:

for(int i = 2 * p; i <= n; i+= p) 

在這裏你循環而i較小或等於n。但是,所有數組的索引必須從0到(size - 1)。您應該分配的數組中的一個額外的條目:

int *a = (int *) malloc(sizeof(int) * (n + 1)); 
0

您分配n整數,索引從0n-1。但是,您正在從4到n循環,這意味着您將分配索引n和損壞的內存。這就是爲什麼free導致錯誤(當您調用它時會檢查是否有損壞)。

您必須修復內存損壞,然後再撥打free調用。

1

更重要的事情:

您分配n INT與int *a = (int *) malloc(sizeof(int) * n);。如果你想訪問這些信息,你必須從0開始,直到n-1。在行while(a[n]) n--;你超出了你分配的內存部分。也許是核心!

而且,如果所有a[n]值都是0不同,會發生什麼情況?你減少n直到達到負值。那這個呢?您可以使用n < 0訪問a[n]值。也許另一個核心。

請記住,這是C/C++。它執行所有你寫的,所以要小心!

一般的編程技術:

  • 確認所有陣列限制。
  • 驗證malloc返回值。
  • 始終freedelete您的指針
  • 使用正確類型:n也許是unsigned,用它!