内存重用实际是啥意思?

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 在其上复制另一个对象。

【讨论】:

以上是关于内存重用实际是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

sga是啥意思?

aix中的paging space指的是啥?

nand flash是啥意思

内存溢出和内存泄漏分别是啥意思?

声明和实例化一个 c# 数组实际上是啥意思?

DLL是啥意思