我试图了解在
free()
分配的缓冲区中对 placement new
的结果调用 malloc()
是否有效。
考虑以下因素。此代码是否表现出任何未定义的行为?
(假设
T
不会重载任何 new
或 delete
运算符)
T* create() {
void* buf = malloc(sizeof(T) + 10);
T* obj = new(buf) T;
return obj;
}
int main() {
T* obj = create();
obj->~T();
free(obj); // or free(static_cast<void*>(obj)
}
可以将
placement new
在 malloc()
'ed 缓冲区上返回的指针传递给 free()
吗?如果我们能够保证static_cast<void*>(obj) == buf
,那么这应该是明确定义的,但我不确定是否真正保证了这种平等; placement new
operator 返回其参数不变,但我不确定是否允许我们假设 placement new
表达式 返回具有相同值/相同地址的指针。
如果未定义,是否有其他方法可以获取可用于访问对象并释放对象的指针,而不会遇到未定义的行为?
如果你使用placement new,你就把内存管理的责任交给了调用者。 它只是调用构造函数在调用者定义的内存中实例化对象的一种方法。
为此,它不是为了放置新的定义如何获取或处置您提供的内存。 定义它的是你对
malloc()
的使用,从这个意义上说,如果你当然应该使用 free()
。
也就是说,在这种情况下,您只是简单地复制默认的
new
在任何情况下都会执行的操作,更安全、更简洁。 当然,不推荐使用该代码示例 - 它需要 create
的调用者知道使用了新的布局,并且内存是由 malloc
分配的。 分配最好由调用者执行,这样它是对称的。