在《c++ primer》这本书中看到,两种智能指针管理内存:
shared_ptr<int> sp (new int[10],[](int*p){delete[] p;}):
unique_ptr<int[]> up (new int[10]);
为什么使用shared_ptr
的时候不需要指明int[]
而可以使用int
呢?
大家讲道理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 は、直接ベクトルを使用することはあまり一般的ではありません。 。
伊谢尔伦2017-04-17 14:54:35
@hearts はすでにかなり包括的に述べていますが、もう 1 つ付け加えさせてください。
ほとんどの場合、vector
を直接使用してください。標準ライブラリは十分に最適化されています。ただし、shared_ptr
と unique_ptr
は特にポリモーフィズムに関しては役に立たないわけではありません。 詳細については、C++ 入門によるオブジェクト プログラミングに関するセクションを参照してください。 shared_ptr
と unique_ptr
、および以前の auto_ptr
はすべて、実際には [危険] な生のポインターを置き換えることを目的としています。 shared_ptr
の使用頻度は低く、unique_ptr
の使用頻度が高いと言われています。
もちろん、vector
と *_ptr
は両方とも RAII 用です。これも興味深いトピックです。
簡単な意見ですが、アドバイスをお願いします。