1. 程式人生 > >C++ vector的釋放

C++ vector的釋放

    專案上用到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