2013-06-03 61 views
0

這是我的第一篇文章,很抱歉,如果沒有問好。動態內存刪除功能

基本上我有動態內存的麻煩,我想知道這是否是我誤解的概念,或功能中的至少一個。好的,所以我使用的是C++,我需要管理一個在主程序循環內改變大小的數組,但是當我嘗試刪除內存時,我總是收到一個堆錯誤。 (下面是我想要做的簡化版)。

void main(void) 
{ 
    //Initialization 

    //main loop 
    while(true) 
    { 
    int* array; 
    function(&array); 

    printf("test %d",array[0]); //basically use the data 

    delete [] array; 
    } 
} 

//in separate file 

void function(**int val) 
{ 
    *val=new int[size of array] // i pass the size of the array... 
           //to the function as well 
    //fill the array with data 
    return; 
} 

好了,所以在此之後我就可以讀取數據,因此必須連接到指針「數組」,但那麼爲什麼它不會讓我刪除這些數據,就好像它已經被刪除了?

任何意見將不勝感激thanx。

+2

你可以發佈原代碼,好像你可能會粉碎你的堆棧。 – Geoffrey

+0

該代碼不會編譯;你在函數聲明的參數列表中有'** int val'。 – tmyklebu

回答

0

您的代碼,在其當前狀態,應該工作。然而,這是非常不好的做法,用newdelete這樣,尤其是新/在不同的地方刪除。

您應該使用std::vector代替:

// main function 
std::vector<int> array = function(); 

printf("test %d",array[0]); //basically use the data 

和你()函數將是:

std::vector<int> function() 
{ 
    std::vector<int> val(size); 
    //fill the array with data 
    return val; 
} 
+0

好的,不好意思記得在將來。 – user2448431

3

不是主要問題,但你確實有語法錯在這裏,

void function(**int val); 

應該是:

void function(int **val); 

但你並不需要一個雙指針,你可以簡單地傳遞指針按引用:

void function(int *&val); 

由此可見,你的程序應該是這樣的:

int main() // main should return int 
{ 
    int *array; 
    function(array, 5); 

    printf("test %d", array[0]); 

    delete [] array; 
} 

void function(int *&val, int size) 
{ 
    val = new int[size]; 
} 

你也不需要while (true)循環。

+0

我正在寫完全一樣的東西。唯一我要補充的是,我相信最初的問題是,在double指針之後,通過引用問題vs指針,當您嘗試使用delete []時,它可能不是使用數組delete的正確時間,應該有實際上只是刪除了,因爲你的引用方式,引用方式等等,你甚至無法訪問你可以正確調用delete []的指針。 – ChrisCM

+0

哦,我的壞,這是一個錯字,但也是一個很好的建議(關於雙指針)thanx – user2448431

+0

但我打算刪除連接到指針的數據不是指針本身我應該仍然使用只是刪除? – user2448431

2

你說的「任何建議」受到歡迎,所以這裏是我的建議:

不要使用C風格數組擺在首位,這將不會是一個問題。使用vector代替:

#include <vector> 
#include <algorithm> 

void main(void) 
{ 
    //Initialization 

    //main loop 
    while(true) 
    { 
     std::vector <int> array; 
     function (array); 
     printf ("test %d", array[0]); 
    } 
} 

//在單獨的文件

void function(std::vector <int>& vec) 
{ 
    vec.push_back (1); 
    vec.push_back (2); 
    // ...etc... 
} 

以上是使用vector而不是C風格的數組和動態內存管理基本的和幼稚的實現。有很多改進的機會,但你明白了。

0

另一個想法。通過引用傳遞事物的價值是大型對象的複製成本。用指針你不需要擔心這一點。這個代碼也可以像這樣清理。

int main() // main should return int 
{ 
    int *array = function(SOME_SIZE); 

    printf("test %d", array[0]); 

    delete [] array; 
} 

int * function(int size) //Just return the pointer 
{ 
    int *temp = new int[size]; 
    return temp; 
} 

因爲我們正在處理的指針...返回他們是不是什麼大不了的,而且是典型的實踐,當你需要動態分配對象的「轉移」的所有權。這就是說,引用矢量或其他標準容器的帖子是最好的方法。避免使用新的和刪除使代碼更安全。

+0

是的,這個問題是我需要從同一個函數返回幾個數組。然而,很明顯,新的和刪除的東西不是很好,我應該將它改爲std :: vectors。 – user2448431

+0

我很高興你已經知道載體更好。我很好奇,但是你認爲你的函數與我的「返回幾個數組」的觀點不同。 – ChrisCM