亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數組放置-新需要緩沖區中未指定的開銷?

數組放置-新需要緩沖區中未指定的開銷?

C++
溫溫醬 2019-11-05 09:04:30
數組放置-新需要緩沖區中未指定的開銷?5.3.4 [expr.new]2月11日的C+草案給出了一個例子:new(2,f) T[5]結果是operator new[](sizeof(T)*5+y,2,f).這里,x和y是表示數組分配開銷的非負的未指定值;新表達式返回的值將由此金額抵消。operator new[]..此開銷可應用于所有數組中。新表達式,包括引用庫函數的那些operator new[](std::size_t, void*)以及其他職位分配功能。開銷的大小可能因新調用而異。-最終例子]現在以下面的示例代碼為例:void* buffer = malloc(sizeof(std::string) * 10);std::string* p = ::new (buffer) std::string[10];根據上面的報價,第二行new (buffer) std::string[10]會在內部打電話operator new[](sizeof(std::string) * 10 + y, buffer)(在構造個人之前)std::string)。問題是如果y > 0,預分配的緩沖區將太小!那么,當使用數組布局時,我如何知道要預先分配多少內存呢?void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);std::string* p = ::new (buffer) std::string[10];還是標準在某個地方保證y == 0在這種情況下?同樣,這句話說:此開銷可應用于所有數組中。新表達式,包括引用庫函數的那些operator new[](std::size_t, void*)以及其他職位分配功能。
查看完整描述

3 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

經過一番討論,我知道我的答案不再適用于這個問題。我會把它留在這里,但確實還需要一個真正的答案。

如果不能很快找到一個好的答案,我很樂意用一些賞賜來支持這個問題。

根據我的理解,我將在這里重申這個問題,希望一個較短的版本可以幫助其他人理解被問到的內容。問題是:

下面的結構總是正確的嗎?是arr == addr最后?

void * addr = std::malloc(N * sizeof(T));T * arr = ::new (addr) T[N];                // #1

我們從標準中知道#1導致調用::operator new[](???, addr),在哪里???是不小于N * sizeof(T),我們也知道呼叫只會返回。addr也沒有其他影響。我們也知道arr被抵消addr相應地。我們所做的知道的是內存是否指向addr是足夠大的,或者我們如何知道要分配多少內存。


你似乎混淆了一些東西:

  1. 您的示例調用operator new[](),不是operator new().

  2. 分配函數不構造什么都行。他(她,它)們分配.

結果是表達 T * p = new T[10];原因:

  1. 打電話給operator new[]()帶尺寸參數10 * sizeof(T) + x,

  2. 對默認構造函數的十個調用T,有效::new (p + i) T().

唯一的特點是數組-新的表達請求比數組數據本身使用的內存更多的內存。你沒有看到任何這些,也不能以任何方式使用這些信息,除非是通過沉默的接受。


如果您想知道實際分配了多少內存,可以簡單地替換數組分配函數。operator new[]operator delete[]把實際尺寸打印出來。


最新情況:作為一種隨機的信息,你應該注意到全局布局-新的。功能都不需要行動。也就是說,當您就地構造一個對象或數組時,如下所示:

T * p = ::new (buf1) T;T * arr = ::new (buf10) T[10];

然后,相應的調用::operator new(std::size_t, void*)::operator new[](std::size_t, void*)除了回答他們的第二個論點外,什么也不做。但是,你不知道buf10應該指向:它需要指向10 * sizeof(T) + y內存字節,但您無法知道y.



查看完整回答
反對 回復 2019-11-06
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

調用任何版本的operator new[] ()對于固定大小的內存區域,不會工作得太好。本質上,它假定它委托給一些真正的內存分配函數,而不僅僅是返回一個指向分配內存的指針。如果您已經有了一個要構造對象數組的內存競技場,則需要使用std::uninitialized_fill()std::uninitialized_copy()構造對象(或單獨構造對象的其他形式)。

您可能會爭辯說,這意味著您還必須手動銷毀內存領域中的對象。然而,打電話delete[] array位置返回的指針new不起作用:它將使用非位置版本的operator delete[] ()!也就是說,當使用放置new您需要手動銷毀對象并釋放內存。



查看完整回答
反對 回復 2019-11-06
  • 3 回答
  • 0 關注
  • 355 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號