2011-07-21 35 views
6

20.6.9:C++默認分配器 - 如果大小不等於傳遞給調用allocate的大小,會發生什麼?

void deallocate(pointer p, size_type n); 
  • 要求:P應爲()從分配獲得的指針值。 n應該等於作爲第一個參數傳遞給調用返回p的allocate的值。
  • 影響:取消分配由p引用的存儲。
  • 備註:使用:: operator delete(void *)(18.6.1),但在調用此函數時未指定。

如果n不等於作爲第一agrgument分配的調用返回其通過p值應發生什麼情況?不要釋放?投擲std::bad_alloc? ...

編輯: 我的意思是「應該發生的事情」是:是否可以在自定義實現中拋出或斷言?

回答

10

像往常一樣在C++標準中,當沒有明確聲明時,違反要求會導致未定義的行爲。 必須意味着在任何時候都必須,這是一個要求,而不是C++標準中的一個選項。

例如這裏就是MSDN says

指針_Ptr必須已經通過調用前面返回來分配的,用於比較等於*此分配器對象,分配相同的尺寸和類型的數組對象。

這意味着尺寸必須精確匹配,否則會遇到未定義的行爲。

+2

Btw .: Microsoft實現忽略傳遞的大小... – 0xbadf00d

+1

@FrEEzE - 該實現可以忽略該參數,因爲它知道它具有**是什麼。其他實現可能會使用它,如果它們本身不記得分配大小的話。 –

+0

忽略大小是一種有效的未定義行爲。 –

3

它不說。這意味着這將是討厭的「未定義的behviour」。

+0

是的,我知道。但是我想知道當大小與分配的大小不匹配時拋出或斷言(在自定義實現中)是否可以。 – 0xbadf00d

+2

如果它是未定義的,你可以做任何你想要的。標準容器肯定會傳遞正確的值。對於你自己的容器**你可以定義行爲。 :-) –

1

這是在標準中存在的,它允許底層分配器不知道指針分配的大小。例如,AmigaOS分配器維護一個空閒內存塊列表,甚至允許部分釋放(即,如果我分配了1024個字節,然後在偏移量爲256的空閒512字節,我結束了兩個256字節的分配),所以allocator希望我將這些信息傳遞給釋放器。

相關問題