2012-02-17 55 views
3

我有以下情況:boost :: ptr_vector與數組:我可以肯定它的析構函數調用delete []而不是刪除?

boost::ptr_vector<float> vec; 

float* array = new float[4](); 
vec.push_back(array); 

// Add some more elements to vec.. 

我怎麼能保證,如果我離開這個範圍,VEC將被銷燬的ptr_vector的析構函數的vec每一個元素調用delete[]而不是delete。我不明白它應該如何工作,因爲模板參數float將與float*float[4]相同。

+2

如果它可以提供給你,'std :: vector >'可以做到這一點。 – GManNickG 2012-02-17 11:09:12

回答

3

你可以指定ptr_vectorCloneAllocator模板參數比默認,heap_clone_allocator以外的東西。沒有辦法讓實際類boost::ptr_vector<float>使用delete[]而不是delete的實例。

+0

是的,我知道這一點。但是像view_clone_allocator這樣的另一個分配器只是不執行釋放。但是我能做些什麼來像ptr_vector那樣使用delete []刪除其包含的數組?應該避免使用std :: vector並遍歷每個元素上調用delete []的元素。 – morph 2012-02-17 11:12:42

+2

@morph:我不認爲Boost提供了一個適合這種情況的方法,因此請編寫您自己的Clone Allocator。大概他們沒有提供的原因是他們不認爲包含指向C數組的指針的'ptr_vector'非常有用 - 它有點難看,因爲ptr_vector訪問器只給出每個數組的第一個元素的引用。我想你最終會寫'(&my_vector [0])[1]',維護一個單獨的容器,其大小和其他這樣的缺陷。如果數組全部大小爲4,則使用'boost :: array '的'vector'或'ptr_vector'。 – 2012-02-17 11:22:08

-4

對於數組containsint BUILT-IN簡單類型項目(如float或char):我認爲delete和delete []之間沒有區別,因爲delete []假定調用很多析構函數 - 對於數組的每個對象,但內建的原始類型不承擔調用析構函數 - 在那裏沒有什麼可以銷燬的;取消分配浮點數組只是釋放實體內存塊,而不執行任何可能放置在某種析構函數中的代碼。穆爾...

+0

嗯..我學會了在用operator new創建的數組上創建的指針上刪除delete,並刪除[]。 – morph 2012-02-17 11:17:26

+5

對使用​​'new []'分配的數組使用'delete'(反之亦然)給出了未定義的行爲。 – 2012-02-17 11:18:01

+0

你對「書中寫什麼」是正確的,但我正在談論「它在現實中如何運作」。 – pavelkolodin 2012-02-17 11:35:09

相關問題