【发布时间】: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,我需要分配内存的详细信息,所以我的想法是分配额外的空间,所以在用户的内存块下,我将保存一个包含分配详细信息(大小等)的对象。
-
那么正确的方法是什么?