検索

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

c++ - 使用智能指针管理动态内存

在《c++ primer》这本书中看到,两种智能指针管理内存:

shared_ptr<int> sp (new int[10],[](int*p){delete[] p;}):

unique_ptr<int[]> up (new int[10]);

为什么使用shared_ptr的时候不需要指明int[]而可以使用int呢?

巴扎黑巴扎黑2772日前474

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

  • 大家讲道理

    大家讲道理2017-04-17 14:54:35

    uniqe_ptr<int> up(new int)、後で削除すると削除されます。
    uniqe_ptr<int []> up(new int[10]) を指定すると、後で削除するときに [] も削除されます。

    組み合わせが正しくないとエラーが発生します。

    shared_ptr 標準が設定されたとき、shared_ptr テンプレートに配列の特殊化を追加することは誰も考えませんでした。したがって、delete[] を呼び出すshared_ptr<int[]>の実装は存在しません。

    shared_ptr<int> sp(new int[10])、後で削除する場合、delete [] の代わりに delete が使用されるため、エラーが発生します。

    shared_ptr にこの配列を削除する方法を指定する必要があります (最後に [](int*p){delete[] p;})。これがないと、削除時にエラーが発生します。

    標準を設定するときにshared_ptrを追加しなかったのはなぜですか?彼らは忘れていた/怠けていた/誰も提案書を書いていなかったため、おそらくこのようになります。

    実際には、配列の unique_ptr とshared_ptr は、直接ベクトルを使用することはあまり一般的ではありません。 。

    返事
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 14:54:35

    @hearts はすでにかなり包括的に述べていますが、もう 1 つ付け加えさせてください。

    ほとんどの場合、vector を直接使用してください。標準ライブラリは十分に最適化されています。ただし、shared_ptrunique_ptr は特にポリモーフィズムに関しては役に立たないわけではありません。 詳細については、C++ 入門によるオブジェクト プログラミングに関するセクションを参照してください。 shared_ptrunique_ptr 、および以前の auto_ptr はすべて、実際には [危険] な生のポインターを置き換えることを目的としています。 shared_ptr の使用頻度は低く、unique_ptr の使用頻度が高いと言われています。

    もちろん、vector*_ptr は両方とも RAII 用です。これも興味深いトピックです。

    簡単な意見ですが、アドバイスをお願いします。

    返事
    0
  • キャンセル返事