Smart Pointerには4つ種類があるらしい。
1. Unique Pointer
2. Shared Pointer
3. Weak Pointer
4. Auto Pointer
まずはUnique Pointerから!
原則、今までやっていたように、新しくobjを作ったときに'delete'が必要ないです。
スコープを抜けた際に自動でheapから確保したメモリを解放してくれるみたいです!
少々宣言がややこしい。
一応2通りあるっぽいです。それは下記コード参照。。
また、値を代入することはできません。
しかし、抜け道があって、move(ptr)
とすれば他スマートポインターの指している場所を移動させることができる。
もちろん、移動元ポインターはnullになってしまいます。
#include <iostream> #include <memory> #include <vector> class Test { public: int data; Test(): data{0} {std::cout << "Test constructor is called. data: " << data <<std::endl;} Test(int data) : data{data} {std::cout << "Test constructor is called. data: " << data << std::endl;} int get_data() const {return data;} ~Test() {std::cout << "Test destructor is called" << std::endl;} }; int main() { Test a; Test b{100}; Test *ptr1 = new Test(); Test *ptr2 = new Test(1000); delete ptr1; delete ptr2; std::unique_ptr<Test> uptr1 {new Test{2000}}; //宣言方法1 std::unique_ptr<Test> uptr2 = std::make_unique<Test>(2000); //宣言方法2 std::unique_ptr<Test> uptr3; //error uptr3 = uptr1; uptr3 = std::move(uptr1); if (!uptr1) std::cout << "nullptr" << std::endl; return 0; }
もちろん、
std::unique_ptr<int> uptr {1000};
みたいな感じ。
また、クラス等を初期化させて宣言させた場合で、vectorにした場合は要注意。
for ( auto vec; smp_class ) { std::cout << *vec << std::endl; }
はvecにsmp_classをコピーすることになってしまうので、
for ( auto &vec; smp_class ) { std::cout << *vec << std::endl; }
としましょう。