首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存重用实际意味着什么?

内存重用实际意味着什么?
EN

Stack Overflow用户
提问于 2014-09-05 05:42:15
回答 2查看 132关注 0票数 0

内存重用意味着什么?例如,我们已经创建和对象。

代码语言:javascript
复制
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条的例子令我感到困惑。例子:

代码语言:javascript
复制
#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,然后再构造一个新的对象。对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-07 12:09:27

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

使用新位置来构造新对象是一个例子,但另一个例子是使用memcpy在其之上复制另一个对象。

票数 2
EN

Stack Overflow用户

发布于 2014-09-05 05:52:56

在这里,存储重用仅仅意味着新对象是在this指向的地址上构造的,不管它在哪里。换句话说,没有为对象分配新的内存。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25679285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档