看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如
int *pa=new int;
double *pa_a = (double *) pa;
这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。
以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?
PHPz2017-04-17 15:24:05
あなたが挙げた例は基本的なタイプのものであり、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源码剖析》