记忆重用实际意味着什么?

时间:2014-09-05 05:42:15

标签: c++ struct new-operator

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,然后我们构造一个新对象。正确?

2 个答案:

答案 0 :(得分:4)

这里,存储重用只是意味着新对象是在this指向的地址处构建的,无论它在哪里。换句话说,没有为对象分配新的内存。

realloc()不是内存重用工具,因为它可能导致分配新块。此外,您的示例具有未定义的行为,因为您无法在使用realloc()分配的内存上使用new

答案 1 :(得分:2)

当对对象占用的任何内存进行任何写入时发生存储重用,并且该写入不是通过布局兼容类型执行的(基本上是严格的别名,但你最好不要对字符类型使用异常)覆盖一部分不可复制的对象部分。

使用placement new构造一个新对象就是一个例子,但另一个例子是使用memcpy复制另一个对象。