16.6効率と柔軟性
この記事では、c ++プライマーはスマートポインターの2つの例を使用します
shared_ptrとunique_ptrが削除子を指定する方法の違いは、実際にはこれら2つのクラスの関数の違いです。
まず、shared_ptrの削除機能を定義する方法を見てみましょう。
csdnのウェブサイトから学ぶ
https://blog.csdn.net/hp_cpp/article/details/103452196
関数のポインターをコンストラクターに渡します。
#include <iostream>
#include <zconf.h>
#include "template.h"
using namespace std;
class Simple{
};
void deleter(Simple *)
{
cout<<"Deleter function called"<<endl;
}
// 构造函数传递自定义删除器指针
int main() {
std::shared_ptr<Simple> p1(new Simple[5],deleter);
return 0;
}
コンストラクターでファンクターを使用する
このような例を見ることができます
class Deleter
{
public:
void operator() (Simple *x) {
std::cout << "Deleter function called" << std::endl;
delete[] x;
}
};
// 构造函数传递自定义删除器指针
int main() {
Deleter del;
std::shared_ptr<Simple> p1(new Simple[5],del);
return 0;
}
演算子のオーバーロードを通じて、クラスを関数のような呼び出しメソッドにオーバーロードできます
Deleter del;
Simple* data = new Simple();
del(data);
これにより、と呼ばれるDeleter関数もトリガーされます
ラムダ式?
私はこの内容を本当に理解していません、ラムダが何であるかわかりません
std::shared_ptr<Sample> p3(new Sample[5], [](Sample *x) {
std::cout << "Deleter function called" << std::endl;
delete[] x;
});
このことをC ++で初めて聞いたとき
このラムダ式を見てみましょう:
ラムダ式はクロージャであることがわかりました。これは、PHPで無名関数と呼ばれるものです。基本的に1回だけ使用されるため、関数名は必要ありません。jsにもクロージャがあります。
最も単純なラムダ式の1つ
[] {} ();
void f()
{
}
int main()
{
f();
}
これを理解すれば、上記の機能は非常に理解しやすいです
#include <memory>
#include <cstring>
#include <vector>
#include <stdio.h>
#include <iostream>
#include <zconf.h>
#include "template.h"
using namespace std;
class Simple{
};
// 构造函数传递自定义删除器指针
int main() {
std::shared_ptr<Simple> p1(new Simple[5],[](Simple* x){
std::cout << "Deleter function called" << std::endl;
delete[] x;
});
return 0;
}
4番目の方法はdefault_deleteを使用することです
std::shared_ptr<Simple> p (new Simple[5],std::default_delete<Simple[]>());
unique_ptrがどのように削除者を指定するかを見てみましょう
unique_ptrは繰り返されず、テンプレートで関数を定義し、パラメーターが渡されたときに実装を行います。
詳しくはcsdnをご覧ください。
https://blog.csdn.net/hp_cpp/article/details/103210135
総括する
最後に、shared_ptrは、削除者のタイプが実行されるまで保存されないため、deleterをメンバーとして直接保存しないことがわかります。実際、削除者のタイプはいつでも変更できます。 unique_ptr deleterはコンパイル時です。ご存知のように、unique_ptrは、deleterを間接的に呼び出すオーバーヘッドを回避します。shared_ptrは、実行時にデリータをバインドすることにより、ユーザーがデリータをリロードするのをより便利にします。