free() 放置新结果?

问题描述 投票:0回答:1

我试图了解在

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
表达式 返回具有相同值/相同地址的指针。

如果未定义,是否有其他方法可以获取可用于访问对象并释放对象的指针,而不会遇到未定义的行为?

c++ c++14 language-lawyer
1个回答
0
投票

如果你使用placement new,你就把内存管理的责任交给了调用者。 它只是调用构造函数在调用者定义的内存中实例化对象的一种方法。

为此,它不是为了放置新的定义如何获取或处置您提供的内存。 定义它的是你对

malloc()
的使用,从这个意义上说,如果你当然应该使用
free()

也就是说,在这种情况下,您只是简单地复制默认的

new
在任何情况下都会执行的操作,更安全、更简洁。 当然,不推荐使用该代码示例 - 它需要
create
的调用者知道使用了新的布局,并且内存是由
malloc
分配的。 分配最好由调用者执行,这样它是对称的。

© www.soinside.com 2019 - 2024. All rights reserved.