2014-09-05 51 views
0

memry reusing是什麼意思?例如,我們已經創建並反對。記憶重用的真實含義是什麼?

struct A { }; 
A *a = new A; 
void *p = operator new(sizeof(A),a); //Is it memory reusing? 
void *p = realloc(sizeof(A),a); //Is it memory reusing? 

我問這個問題,因爲3.8/6節中的例子讓我感到困惑。這個例子:

#include <cstdlib> 
struct B { 
    virtual void f(); 
    void mutate(); 
    virtual ~B(); 
}; 
struct D1 : B { void f(); }; 
struct D2 : B { void f(); }; 
void B::mutate() { 
    new (this) D2; //1, reuses storage — ends the lifetime of *this 
    f(); // undefined behavior 
    ... = this; // OK, this points to valid memory 
} 

也就是說,在//1我們首先調用placement-new其重用內存,以及緊接在該構造了一個新的對象。對?

+0

爲什麼沒有定義行爲? – 2014-09-05 06:24:59

+0

@ david.pfx:請參閱http://stackoverflow.com/questions/9117358/is-it-allowed-to-write-an-instance-of-derived-over-an-instance-of-base – 2014-09-07 12:03:49

+0

放置表單的分配函數是* always * a no-op。 (庫的版本是,如果你替換庫的版本,標準會使你的整個程序不確定的行爲,參見'[new.delete.placement]') – 2014-09-07 12:06:00

回答

2

存儲重用發生在任何對該對象佔用的任何內存的寫入發生時,並且該寫入不是通過佈局兼容類型執行的(基本上嚴格的別名,但是最好不要使用字符類型的異常覆蓋不平凡可複製對象的部分)。

使用placement new構造一個新對象就是一個例子,但另一個例子是使用memcpy來複制另一個對象。

4

這裏,存儲重用僅僅意味着新對象被構建在this所指向的地址處,無論哪裏都可能。換句話說,沒有新的內存分配給對象。

realloc()不是內存重用工具,因爲它可能會導致分配新塊。此外,您的示例具有未定義的行爲,因爲您無法在使用new分配的內存上使用realloc()