memry重用是什么意思?例如,我们已创建并反对。
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 :(得分:4)
这里,存储重用只是意味着新对象是在this
指向的地址处构建的,无论它在哪里。换句话说,没有为对象分配新的内存。
realloc()
不是内存重用工具,因为它可能导致分配新块。此外,您的示例具有未定义的行为,因为您无法在使用realloc()
分配的内存上使用new
。
答案 1 :(得分:2)
当对对象占用的任何内存进行任何写入时发生存储重用,并且该写入不是通过布局兼容类型执行的(基本上是严格的别名,但你最好不要对字符类型使用异常)覆盖一部分不可复制的对象部分。
使用placement new构造一个新对象就是一个例子,但另一个例子是使用memcpy
复制另一个对象。