C++ vector的釋放
阿新 • • 發佈:2019-01-02
專案上用到vector容器,沒有手動釋放,總是會在這裡出現記憶體分配不成功的問題,因此對vector的釋放了解了一下。
初始程式碼如下:
vector <float*> dets(nTotalLayers); //dets : 記錄每層影象的 Hessian 行列式; for (int octave = 0; octave < nOctaves; octave++) { for (int layer = 0; layer < nOctaveLayers + 2; layer++) { /* The integral image sum is one pixel bigger than the source image*/ dets[index] = (float*)malloc((height / step)*(width / step)*sizeof(float)); } step *= 2; }
1、關於是否需要手動釋放
(1)直接宣告的vector容器是一個普通變數,相當於一個未知大小的動態陣列,不需要手動釋放,超出作用於範圍時會自動回收。
(2)如果是*vec = new vector<>( )這種方法動態建立的vector,則需要delete vector;
(3)如果vector裡面存放的是元素而不是指標,這些元素會隨vector的釋放而自動釋放;
(4)如果vector裡面存放的是指標,並且指向自己new或malloc的資料,那麼需要一個一個手動釋放指標。也就是上面程式碼的情況。
2、關於vector
vector類稱作向量類,它實現了動態陣列,用於建立元素數量變化的物件陣列。像陣列一樣,vector類也用從0開始的下標表示元素的位置,但和陣列不同的是,當vector物件建立後,陣列的元素個數可以隨著vector物件元素個數的增大和縮小而自動變化。當程式設計師不知道需要多大的記憶體空間時,可以使用vector,vector會自動申請足夠大的空間以供使用。vector會在程式結束時回收記憶體,但也不能立刻回收投入使用,所以不熟練時儘量少用。
float** dets = (float **)malloc(nTotalLayers*sizeof(float*)); for (int octave = 0; octave < nOctaves; octave++) { for (int layer = 0; layer < nOctaveLayers + 2; layer++) { /* The integral image sum is one pixel bigger than the source image*/ dets[index] = (float*)malloc((height / step)*(width / step)*sizeof(float)); // 這裡面有除以遍歷影象用的步長 if (dets[index] == NULL) { cout << "Can't allocate memory to dsts" << endl; exit(1); } } step *= 2; } //釋放指標的向量 for (int i = 0; i < nTotalLayers; i++) { free(dets[i]); } free(dets); dets = NULL;
3、vector記憶體的釋放
可以用swap函式進行釋放,參考:用swap釋放vector