ためになるホームページ お問い合わせ




TOP > C++ > auto_ptr
auto_ptrの利用方法
STLのauto_ptrは、動的に取得したポインタの管理を行ってくれる。
"メモリの開放の忘れ"に対して有効である。

auto_ptrの弱点
auto_ptrはオブジェクトなのでスタック領域に確保され、そのスコープを抜けると自然消滅する。当然、オブジェクト自体が消滅するので、保持しているポインタも消滅する。

auto_ptrの例
#include <iostream>
#include <memory>
using namespace std;


class CTest {
public:
  CTest() : m_a(0){ };
  ~CTest(){
    if (m_a) delete m_a;
  };
  void init() {
     m_a = new int;
  }
  void setParam(int a) {
    *m_a = a;
  }
private:
  int *m_a;
};

extern void CheckPointer(auto_ptr own);

//テスト
int main(int argc, char** argv)
{

 
  /// ポインタを引数で渡し、コンストラクタを起動
  auto_ptr  p(new CTest());
  
  /// 演算子のオーバーロードにより、このようにメンバを呼び出せる。
  p->init();
  p->setParam(10);

  
  /// コピーコンストラクタが呼ばれ、
  /// 所有権がかわる
  CheckPointer(p);

  /// 関数を抜けた時点で、CTestのデストラクタは呼ばれ、
  /// m_aは、開放されている
  /// よって、以下の関数の呼び出しはできない。 
  /// p->setParam(10);
  return(0);
}

void CheckPointer(auto_ptr own)
{
  /// コピーコンストラクタが呼ばれ、
  /// 所有者がownに移る
  /// この関数を抜ける時に、CTestのデストラクタが呼ばれる
  return;
}







Copyright 2007 ためになるホームページ All Rights Reserved.