【问题标题】: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,它重用了内存,然后我们构造了一个新对象。对吧?

【问题讨论】:

  • 为什么是未定义的行为?
  • 分配函数的放置形式是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完全没有关系。

标签: c++ struct new-operator


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 2018-09-13
      • 2020-05-12
      • 2021-09-17
      相关资源
      最近更新 更多