2013-05-16 26 views
0

我想了解在這段代碼中,當從main_func()訪問時,存儲在向量func()中的指針是否有效,如果是這樣,爲什麼?在調用的函數內部分配的指針是否有效?

void func(vector<double*>& avector) { 
    double a=0,b=0; 
    for (int i=0;i<10;i++) { 
     double *a = new double[2]; 
     avector.push_back(a); 
     avector[avector.size()-1][0] = a; 
     avector[avector.size()-1][1] = b; 
    } 
} 

void main_func(){ 

    vector<double*> v; 
    func(v); 
    for (int i=0;i<v.size();i++) 
    { 
    // access a 
    // References stored in vector valid??? 
    } 

} 
+0

你的意思是「存儲的指針」,而不是「參考存儲」對的載體? – PlasmaHH

+0

將指針存儲到向量中動態分配數組的第一個元素是很奇怪的。你確定你需要這樣做嗎? – juanchopanza

+0

很抱歉的指針,相應編輯的問題 –

回答

0

讓我們來看看基礎。指針只是四字節的整數值,表示存儲器中存在某些數據的地址。動態內存分配是應用程序全局的,所以如果你通過new,new[]malloc(或類似的東西)在你的程序中的任何地方分配內存,你可以在任何你喜歡和操作系統保證的地方使用這個內存,它不會被移動到任何地方(就地址而言,你從內存分配例程中獲得)。

那麼讓我們回到您的程序。你在函數內部分配一些內存,並將指向該內存的指針的地址存儲在向量中。當你退出這個函數時,這些指針仍然是完全有效的,你可以隨意使用它們。

不要忘了釋放他們,當你不再需要他們了!

0

它們是有效的,因爲它們是用新創建的,這意味着它們具有動態存儲持續時間。但是,您確實缺少相應的刪除操作,從而導致內存泄漏。

+0

啊,是的,抱歉,這就是我的意思。 :)應用你的改變。 – Sarien

0

你的向量不存儲引用,但指向堆上的對象。該對象是一個兩個雙打的數組,您只需複製本地變量的值。所以一切都是好的(除非你不釋放內存)。

如果你在某處(存儲和)返回引用或指向函數本地語言的指針,那麼這些語句在函數外部沒有任何意義。

相關問題