内存重用实际是啥意思?
Posted
技术标签:
【中文标题】内存重用实际是啥意思?【英文标题】:What does memory reusing actual mean?内存重用实际是什么意思? 【发布时间】:2014-10-30 00:26:01 【问题描述】:内存复用是什么意思?例如,我们创建了对象。
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
,它重用了内存,然后我们构造了一个新对象。对吧?
【问题讨论】:
为什么是未定义的行为? @david.pfx:见***.com/questions/9117358/… 分配函数的放置形式是always一个no-op。 (库版本是,如果您替换库版本,标准会使您的整个程序行为未定义,请参阅[new.delete.placement]
部分)
@BenVoigt:不,我不这么认为。我想一定是S3.8/5the pointer is used to access a non-static data member or call a non-static member function of the object
。
@david.pfx:我上面的两个cmets完全没有关系。
【参考方案1】:
在这里,存储重用只是意味着新对象在this
指向的地址处构造,无论该地址可能在哪里。换句话说,没有为对象分配新的内存。
realloc()
不是内存重用工具,因为它会导致分配新块。此外,您的示例具有未定义的行为,因为您不能在使用 new
分配的内存上使用 realloc()
。
【讨论】:
【参考方案2】:当对对象占用的任何内存进行任何写入时,就会发生存储重用,并且该写入不是通过与布局兼容的类型执行的(基本上是严格的别名,但您最好不要使用字符类型的异常来覆盖不可复制的对象的一部分)。
使用placement new 构造一个新对象是一个例子,但另一个例子是使用memcpy
在其上复制另一个对象。
【讨论】:
以上是关于内存重用实际是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章