2012-10-07 75 views
1

我有一個指針數組的載體vector<int> *F[12];,我想初始化一些載體及其地址存儲在F.聲明載體在for循環

for(uint i = A; i <= B; ++i){ 
    vector<uint> newvec(pow2(i), 0); 
    F[i] = &newvec; 
} 

但是當我嘗試以後訪問這些網站,我發現它們並非全部爲零:

for(uint i = A; i <= B; ++i){ 
    for(uint j = 0; j <= pow2(i); ++j){ 
     if((*F[i]).at(j) != 0){ 
      cout << i << "/" << j << "/" << (*F[i]).at(j) << "|"; 
     } 
    } 
} 

我假設這與聲明向量的範圍有關。爲什麼記憶被釋放了?我必須使用malloc並從中創建矢量嗎?

+1

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

回答

2

newvec正在每次迭代調用堆棧上創建。每次通過循環創建它時,都會指向它,然後消失。你想使用'new'操作符在堆中創建一個持久化的向量實例。

+0

'vector * newvec = new vector (pow2(i), 0); F [i] = newvec;'似乎修復它,謝謝。 – Arcinde

+0

@ user49164:沒有理由在這裏動態分配向量。使用像'std :: vector'這樣的容器的好處之一是它可以爲你管理內存。當你動態分配它時,你現在必須釋放它。最好只是將'vector&'作爲函數的參數,並填充或返回'vector' –

2

newvec當循環退出時超出範圍。任何現有的引用或指針都是無效的。你需要在合適的範圍聲明對象(我不知道在這種情況下是什麼,但肯定在for循環之外)。