C++スマートポインタの理解についてauto_ptr

2751 ワード

ネット上にはauto_についてたくさんありますptrは、newとdeleteの不適切な使用によるメモリ漏洩の問題を解決するために使用される限り、問題を解決します.
原理:スタック内の変数のライフサイクル.スタックを終了すると、変数が解放されます.つまり、オブジェクトの構造関数が実行されます.元のオブジェクトに基づいてさらにカプセル化され、上層部がdeleteを担当していると言える.
簡単な例です
#include <iostream>
#include <memory>
using namespace std;
class TC
{
      public:
             TC(){cout<<"TC()"<<endl;}
             ~TC(){cout<<"~TC()"<<endl;}
			 void print() {
				 cout<<num<<endl;
			 }
	  int num;
};

void test()
{
auto_ptr<TC> pTC(new TC);	
}
int main()
{
     test();
     return 0;
}
出力結果は
TC()
~TC()
簡単ですauto_についてptrの弱点はたくさんありますが、ネット上ではいろいろな説がありますが、訂正したいのはauto_です.ptrは=番号でコピーしないほうがいいです.そうしないと、元のポインタは使えません.これは所有権移転によるものですから、VC 6に置きます.0は間違っています.VS 2008は正しいです.memory.hのバージョンが違う
VC6.0のヘッダファイルパスは、C:Program FilesMicrosoft Visual StudioVC 98IncludeMEMORY
VS 2008ヘッダファイルの道路力:C:Program FilesMicrosoft Visual Studio 9.0VCinclude
VC6.0がどのように実現されるかは、ソースコードを見てください.
template<class _Ty>
	class auto_ptr {
public:
	typedef _Ty element_type;
	explicit auto_ptr(_Ty *_P = 0) _THROW0()
		: _Owns(_P != 0), _Ptr(_P) {}
	auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
		: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
	auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
		{if (this != &_Y)
			{if (_Ptr != _Y.get())
				{if (_Owns)
					delete _Ptr;
				_Owns = _Y._Owns; }
			else if (_Y._Owns)
				_Owns = true;
			_Ptr = _Y.release(); }
		return (*this); }
	~auto_ptr()
		{if (_Owns)
			delete _Ptr; }
	_Ty& operator*() const _THROW0()
		{return (*get()); }
	_Ty *operator->() const _THROW0()
		{return (get()); }
	_Ty *get() const _THROW0()
		{return (_Ptr); }
	_Ty *release() const _THROW0()
		{((auto_ptr<_Ty> *)this)->_Owns = false;
		return (_Ptr); }
private:
	bool _Owns;
	_Ty *_Ptr;
	};

明らかにVC 6.0権限移転はありませんauto_ptr<_Ty>&operator=関数、他人のコピーを引用するだけで、パス_Owns変数はdeleteを制御し、コピーを使用すると前のオブジェクトの_Ownsはfalseにして、コードをよく見るとわかります.releaseは変化ですOwnsの値.
したがって、権限移行による参照オブジェクトが空であることを心配することなく、レプリケーションを完全に使用できます.
VS 2008はどうやって?
	template<class _Other>
		auto_ptr<_Ty>& operator=(auto_ptr<_Other>& _Right) _THROW0()
		{	// assign compatible _Right (assume pointer)
		reset(_Right.release());
		return (*this);
		}	
	
	_Ty *release() _THROW0()
		{	// return wrapped pointer and give up ownership
		_Ty *_Tmp = _Myptr;
		_Myptr = 0;
		return (_Tmp);
		}

明らかにここに権限移転の説があります.コピーするときに前のオブジェクトを空に適用するからです.
マイクロソフトがなぜこのようにするのか、私はよく分かりませんが、私が理解できるのは規範的な基準でしょう.スマートポインタというものは、使う人がどれだけ知っているかを見て、これがよくないというわけではありません.それはよくないというわけではありません.