' P '

whatever I will forget

C++ Smart Pointer

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;
}

としましょう。