看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如
int *pa=new int;
double *pa_a = (double *) pa;
这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。
以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?
你举的这个例子是针对基本类型,而且举得不好,
int
的size
比double
的size
要小,这样容易出问题placement new
的作用不是开辟新内存,是在指定内存块上构造对象举个例子:
在上面的代码中,
pb
并没有指向一块新开辟的内存,而是重用了pa
指向的内存,直接在
pa
指向的内存上调用B
的构造函数,执行完后,
pb == pa
,只是内存上的A
对象变为了B
对象注:
sizeof(B) <= sizeof(A)
而你说的
强制类型转换
,只改变了指针类型,是无法调用B
的构造函数的,即,内存块上依然是A
对象而变不为B
对象工程实践上一般用在内存管理这一块上,
在某些需要效率更高、灵活度更大的内存分配策略的场合上(比如实现自己的
内存池
),就会用到placement new
(复用原有内存块,就可以免除malloc
、free
的频繁发生)比如你天天在用的
stl
,它底下的memory allocator
就用到了placement new
(详情可以读读《stl源码剖析》
)