検索

ホームページ  >  に質問  >  本文

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

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

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

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

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

伊谢尔伦伊谢尔伦2807日前686

全員に返信(1)返信します

  • PHPz

    PHPz2017-04-17 15:24:05

    あなたが挙げた例は基本的なタイプのものであり、intsizedoublesizeよりも小さいため、問題が発生しやすいです

    placement new の機能は、新しいメモリを開くことではなく、指定されたメモリ ブロック上にオブジェクトを構築することです

    例:

    リーリー

    上記のコードでは、pb は新しく割り当てられたメモリを指しませんが、pa が指すメモリを再利用します。
    は、<🎜 が指すメモリ上で pa の構造体を直接呼び出します。 > 関数 B が実行された後、
    、メモリ内の pb == pa オブジェクトだけが A オブジェクト B
    になります。 注: sizeof(B) <= sizeof(A)

    ご指摘の

    については、ポインタの型のみが変更されており、强制类型转换 のコンストラクターを呼び出すことができません。つまり、メモリ ブロックは B オブジェクトのままですが、A ではありません。オブジェクトB

    エンジニアリングの実践では、一般にメモリ管理で使用されます。

    は、より効率的で柔軟なメモリ割り当て戦略が必要な場合 (独自の
    内存池 に実装するなど) で使用されます。元のメモリ ブロックを再利用すると、placement newmalloc の頻繁な発生を回避できます) free

    たとえば、

    を毎日使用する場合、その下の stl が使用されます memory allocator (詳細については placement new を参照してください) 《stl源码剖析》

    返事
    0
  • キャンセル返事