【问题标题】:C++ objects and memory allocationC++ 对象和内存分配
【发布时间】:2019-12-08 19:45:05
【问题描述】:

假设我有以下代码:

Object* obj = new Object();
void* mem = malloc(sizeof(obj) + 40);
*((Object*)mem) = *obj;

在这种情况下,是否可以保证obj 数据将存储在malloced 内存的开头,我是否可以使用块mem + sizeof(obj) 的其余部分而不覆盖obj

【问题讨论】:

  • 保证未定义的行为。
  • 好的,我们来问一个问题——你要解决的真正问题是什么?
  • 这行不通,因为第三行中的赋值运算符期望您分配给的 Object 是一个有效的对象(即,一个已经构造并处于有效状态的对象),但是您使用的是指向一堆未初始化字节的指针 (mem)。使用placement-new,例如,您可能会有更好的运气。 Object * newObj = new (mem) Object();
  • 我们被要求实现 malloc 和 free 函数。为了实现free,我需要分配内存的详细信息,所以我的想法是分配额外的空间,所以在用户的​​内存块下,我将保存一个包含分配详细信息(大小等)的对象。
  • 那么正确的方法是什么?

标签: c++ object memory


【解决方案1】:

您肯定会有未定义的行为。

首先,sizeof(obj) 是指针的大小,而不是 Object 的大小。使用sizeof(*obj)sizeof(Object)。其次,mem 的位置没有Object,所以这个取消引用*((Object*)mem) 是未定义的行为。

使用placement new:

new (mem) Object(*obj); // or new (mem) Object(std::move(*obj));

Object 放在mem 块的开头。您可以自行决定使用40 剩余字节数。

【讨论】:

  • 更好的是,他可以使用sizeof(Object),从而完全消除Object* obj = new Object(); 这一行。
  • @JeremyFriesner,这可能是obj 在第一次new 之后以某种方式修改的情况。如果不是这样,我同意你的评论。
  • 问题是我不能使用 malloc 或 free。 memcpy 可以工作吗?
  • @GuyBerkovitz 那么这对我来说似乎是一个新问题。这个问题中没有提到任何相关内容。
  • Placement-new 适用于任何内存,包括来自 brk() 或 mmap() 的内存。
猜你喜欢
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2014-03-17
  • 2021-05-05
  • 1970-01-01
  • 2012-02-21
相关资源
最近更新 更多