2015-04-27 45 views
1

內存管理我有一個小程序:與刪除

#include <iostream> 

using namespace std; 

void inputArray(int*& p, int& n); 
void print(int *p, int n); 

int main() { 
    int size = 0; 
    int *arr; 
    inputArray(arr, size); 
} 

void inputArray(int*& p, int& n) { 
    int *q = new int[n]; int m = n; 
    for (int i = 0; i < n; ++i) q[i] = p[i]; 
    cout << endl << "How many numbers to insert? "; cin >> n; 
    delete p; 
    p = new int[n + m]; 
    for (int i = 0; i < m; ++i) p[i] = q[i]; 
    for (int i = 0; i < n; ++i) cin >> p[i + m]; 
    n += m; 
} 

此方案的目的是要插入整數的數組。然而,當我嘗試在Ubuntu上運行使用代碼:: Blocks的程序,它經常說:

free(): invalid pointer: 0xb7646000 *** 

後,我輸入的n個。

但是,當我刪除delete p;時,一切正常。但是,我仍然想知道這個問題。任何人都可以告訴問題是什麼?

+1

你有未定義的行爲,'p'(這是從主'arr')未初始化,但你嘗試刪除它。 – Borgleader

+0

嘗試'int * arr = null;' – user3528438

+0

請不要以這種方式改變指針 - 你有內存泄漏(即使有正確初始化的'arr = 0) –

回答

4
delete p; 

你永遠不分配p,所以當你嘗試freep,它不能。 這就像試圖訪問他人的銀行帳戶,你可能有name,但你不允許免費他的money

- 只是爲了rant-,嘗試使用更詳細的變量名稱,它永遠不會傷害。特別是如果你在一年內喝醉了 - 查看你的代碼。

+0

是的,感謝您的幫助和建議。但這只是一個測試內存管理的草案,所以我不認爲有必要使用有意義的名稱變量。 – pexea12

+0

@PeaNguyen雖然我通常會同意小測試代碼,但您永遠不會知道什麼時候會重複使用過去的小部分代碼。 – Mekap

3

您從陣列p

for (int i = 0; i < n; ++i) q[i] = p[i]; 

p分配元素從未分配或指派任何值

int *arr; 
inputArray(arr, size); // Here "arr" is "p" within the function 

這構成不確定的行爲,並會表現爲這樣。