看了书上,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源码剖析》