【转自知乎】关于new的定位功能(placement new),这个功能是不是多余的?

发布于 2022-09-04 12:52:51 字数 399 浏览 33 评论 0

看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如

int *pa=new int;
double *pa_a = (double *) pa;

这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。

以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

沩ん囻菔务 2022-09-11 12:52:51

你举的这个例子是针对基本类型,而且举得不好,intsizedoublesize要小,这样容易出问题

placement new的作用不是开辟新内存,是在指定内存块上构造对象

举个例子:

struct A {...};
struct B {...};

A* pa = new A;
pa->~A();
B* pb = new (pa) B

在上面的代码中,pb并没有指向一块新开辟的内存,而是重用了pa指向的内存,
直接在pa指向的内存上调用B的构造函数,
执行完后,pb == pa,只是内存上的A对象变为了B对象
注: sizeof(B) <= sizeof(A)

而你说的强制类型转换,只改变了指针类型,是无法调用B的构造函数的,即,内存块上依然是A对象而变不为B对象

工程实践上一般用在内存管理这一块上,
在某些需要效率更高、灵活度更大的内存分配策略的场合上(比如实现自己的内存池),就会用到placement new(复用原有内存块,就可以免除mallocfree的频繁发生)

比如你天天在用的stl,它底下的memory allocator就用到了placement new(详情可以读读《stl源码剖析》

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文