2011-02-17 35 views
0

我想用一個函數來刪除內存分配。該代碼如下...錯誤刪除大量撥款C++

#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 

using namespace std; 

int NOS, *NO, *SQR; 

int Square() 
{ 
    SQR = new int [NOS]; 
    if (!SQR) 
    { 
     cout<<"Mem Error SQR \n"; 
     exit(0); 
    } 
    for (int i = 0; i < NOS; i++) 
    { 
     SQR[i] = NO[i]*NO[i]; 
    } 
} 

void ERASE_MEM() 
{ 
    if (SQR) delete [] SQR; 
    cout<<"Deleted 1\n"; 
    if (NO != NULL)  delete [] NO; 
    cout<<"Deleted 2\n"; 
} 

int main() 
{ 
    cout<<"Enter No : "; 
    cin >> NOS; 
    NO = new int [NOS]; 
    if (!NO)  
    { 
     cout<<"Mem Error NO \n"; 
     exit(0); 
    } 
    for (int i = 0; i < NOS; i++) 
    { 
     NO[i] = 1+i; 
    } 
    Square(); 
    delete NO; 
    ERASE_MEM(); 
} 

如果這個數小於15,則程序工作正常,但如果NOS大於15,我得到以下錯誤:

* glibc的檢測 ./MEM:雙重釋放或腐敗(上):0x097fa008 * *

我才能這樣做是爲了爲所有內存解除分配創建一個函數,我可以在分配內存時調用它。如果分配失敗,該函數將取消分配所有以前的分配。

感謝

+1

與你的問題沒有關係,但不檢查`new`的結果爲null。如果分配內存出錯,它通常會拋出。 – 2011-02-17 04:55:43

+1

在刪除之前,您也不必檢查空指針,因爲需要刪除來處理空指針。 – 2011-02-17 04:59:52

回答

2

您在主代碼ERASE_MEM刪除NO(不正確),然後再次(正確)

編輯:調用delete不會設置指針爲空,也不能做到這一點,因爲該調用只獲取指針的值,而不是指針本身。
這是一個更清晰的'C'版本free(pData)不能更改pData - 只有pData指向的內容。一個常見的'C'成語是定義你自己的Free(void **ptr),你可以用Free(&pData)來調用,然後可以將pData設置爲NULL。
另請注意,使用空指針調用free/delete是完全安全的,該函數會爲您執行檢查。

不要太難deletedelete []是C++的一個令人討厭的角落,它們看起來像語句的函數調用,刪除和數組的語法更糟。唯一很好的部分是,使用智能指針和現代C++,您永遠不必使用它們

+0

在函數中我首先檢查NO是否爲NULL或NOT。我的猜測是,如果我刪除了NO,它將變爲NULL,所以if語句將爲false,並且程序終止而沒有錯誤。如果NOS <16,此方案工作良好,否則我會收到錯誤消息。 – DKTR 2011-02-17 04:57:36

4

您正在刪除NO兩次,一次在main之內,一次在ERASE_MEM之內。此外,main中使用的delete的語法是錯誤的,因爲它應該使用delete[](或更好地移除語句)。順便說一句,還有一點要注意的是,當new失敗時,它不會返回空指針,而是拋出std::bad_alloc異常。因此,從new重新驗證內存位置是沒有意義的。另外,不要使用全部大寫字母作爲函數名稱,一般編碼習慣是僅將全部大寫字母名稱用於宏。在調用delete[]之前,也不需要檢查NULL指針。標準保證刪除空指針將不會執行任何操作。