auto_ptr 類別
以智慧型指標包裝資源,確保當控制離開區塊時,會自動終結該資源。
從 C++11 開始,請使用 unique_ptr
而非 auto_ptr
。 如需詳細資訊,請參閱 unique_ptr
類別。 auto_ptr
在 C++11 中已被取代,並在 C++17 中移除。
如需 throw()
和例外狀況處理的詳細資訊,請參閱例外狀況規格 (throw)。
語法
class auto_ptr {
typedef Type element_type;
explicit auto_ptr(Type* ptr = 0) throw();
auto_ptr(auto_ptr<Type>& right) throw()
;
template <class Other>
operator auto_ptr<Other>() throw();
template <class Other>
auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
template <class Other>
auto_ptr(auto_ptr<Other>& right);
auto_ptr<Type>& operator=(auto_ptr<Type>& right);
~auto_ptr();
Type& operator*() const throw();
Type * operator->()const throw();
Type *get() const throw();
Type *release()throw();
void reset(Type* ptr = 0);
};
參數
right
要從中取得現有資源的 auto_ptr
。
ptr
此指標指定了要取代的已儲存指標。
備註
類別範本描述設定物件的智慧型指標,稱為 auto_ptr
。 這個指標必須是 null,或指定 new
所配置的物件。 如果將 auto_ptr
的儲存值指派給另一個物件,則會轉移擁有權。 (它會以 Null 指標取代傳輸之後的預存值。的解構函式 auto_ptr<Type>
會刪除已配置的物件。 auto_ptr<Type>
可確保當控制離開區塊時 (即使是透過擲回例外狀況),會自動刪除配置物件。 您不應該建構擁有相同物件的兩個 auto_ptr<Type>
物件。
您可以將 auto_ptr<Type>
物件當做函式呼叫的引數,以傳值方式來傳遞。 auto_ptr
不能是任何標準連結庫容器的專案。 您無法使用C++標準連結庫容器可靠地管理一連串 auto_ptr<Type>
的物件。
成員
建構函式
名稱 | 描述 |
---|---|
auto_ptr |
auto_ptr 類型物件的建構函式。 |
Typedefs
名稱 | 描述 |
---|---|
element_type |
此類型是範本參數 Type 的同義字。 |
函式
名稱 | 描述 |
---|---|
get |
這個成員函式會傳回儲存的指標 myptr 。 |
release |
這個成員會以 null 指標取代儲存的指標 myptr ,並傳回先前儲存的指標。 |
reset |
這個成員函式只有在儲存的指標值 myptr 因函式呼叫而變更時,才會評估運算式 delete myptr 。 然後會以 ptr 取代儲存的指標。 |
操作員
名稱 | 描述 |
---|---|
operator= |
指派運算子,將擁有權從一個 auto_ptr 物件轉移至另一個物件。 |
operator* |
auto_ptr 類型物件的取值運算子。 |
operator-> |
允許成員存取的運算子。 |
operator auto_ptr<Other> |
從一種 auto_ptr 轉換成另一種 auto_ptr 。 |
operator auto_ptr_ref<Other> |
從 auto_ptr 轉換成 auto_ptr_ref 。 |
auto_ptr
auto_ptr
類型物件的建構函式。
explicit auto_ptr(Type* ptr = 0) throw();
auto_ptr(auto_ptr<Type>& right) throw();
auto_ptr(auto _ptr_ref<Type> right) throw();
template <class Other>
auto _ptr(auto _ptr<Other>& right) throw();
參數
ptr
auto_ptr
所封裝物件的指標。
right
要由建構函式所複製的 auto_ptr
物件。
備註
第一個建構函式會 ptr
儲存在 中 myptr
,這是所配置物件的預存指標。 第二個建構函式會儲存 right
,以轉移 right
中所儲存指標的擁有權。 在中myptr
發行。
第三個建構函式的行為與第二個建構函式相同,不同之處在於它會儲存 right
。 ref
. release
在 中 myptr
,其中 ref
是儲存在 中的 right
參考。
如果的指標可以隱含轉換成 的Type
指標Other
,則樣板建構函式的行為與第二個建構函式相同。
範例
// auto_ptr_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
cout << "Constructing " << ( void* )this << endl;
x = i;
bIsConstructed = true;
};
~Int( )
{
cout << "Destructing " << ( void* )this << endl;
bIsConstructed = false;
};
Int &operator++( )
{
x++;
return *this;
};
int x;
private:
bool bIsConstructed;
};
void function ( auto_ptr<Int> &pi )
{
++( *pi );
auto_ptr<Int> pi2( pi );
++( *pi2 );
pi = pi2;
}
int main( )
{
auto_ptr<Int> pi ( new Int( 5 ) );
cout << pi->x << endl;
function( pi );
cout << pi->x << endl;
}
Constructing 00311AF8
5
7
Destructing 00311AF8
element_type
此類型是範本參數 Type
的同義字。
typedef Type element _type;
get
這個成員函式會傳回儲存的指標 myptr
。
Type *get() const throw();
傳回值
儲存的指標 myptr
。
範例
// auto_ptr_get.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << ( void* )this << " Value: " << x << endl;
};
~Int( )
{
cout << "Destructing " << ( void* )this << " Value: " << x << endl;
};
int x;
};
int main( )
{
auto_ptr<Int> pi ( new Int( 5 ) );
pi.reset( new Int( 6 ) );
Int* pi2 = pi.get ( );
Int* pi3 = pi.release ( );
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6
operator=
指派運算子,將擁有權從一個 auto_ptr
物件轉移至另一個物件。
template <class Other>
auto_ptr<Type>& operator=(auto_ptr<Other>& right) throw();
auto_ptr<Type>& operator=(auto_ptr<Type>& right) throw();
auto_ptr<Type>& operator=(auto_ptr_ref<Type> right) throw();
參數
right
auto_ptr
類型的物件。
傳回值
類型為 auto_ptr<Type>
之物件的參考。
備註
指派會評估表達式 delete myptr
,但只有在儲存的指標 myptr
因指派而變更時。 然後,它會藉由儲存許可權來轉移儲存在右側的指標擁有權。myptr
中的 release
。 函式會傳回 *this
。
範例
如需使用成員運算子的範例,請參閱 auto_ptr
。
operator*
auto_ptr
類型物件的取值運算子。
Type& operator*() const throw();
傳回值
指標擁有之型 Type
別對象的參考。
備註
間接取值運算子會傳回 *
get
。 因此,儲存的指標不得為 Null。
範例
如需如何使用成員函式的範例,請參閱 auto_ptr
。
operator->
允許成員存取的運算子。
Type * operator->() const throw();
傳回值
擁有的物件 auto_ptr
成員。
備註
選取運算符會傳 get
( )
回 ,讓表達式 ap
->member
的行為與 ( ap
相同。 get
() -->member
,其中 ap
是 類別>auto_ptr<
Type
的物件。 因此,預存指標不得為 Null,而且 Type
必須是具有成員的 member
類別、結構或等位型別。
範例
如需如何使用成員函式的範例,請參閱 auto_ptr
。
operator auto_ptr<Other>
從一種 auto_ptr
轉換成另一種 auto_ptr
。
template <class Other>
operator auto _ptr<Other>() throw();
傳回值
類型轉換運算符會傳auto_ptr<
回 Other>(*this)
。
範例
// auto_ptr_op_auto_ptr.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
auto_ptr<int> pi ( new int( 5 ) );
auto_ptr<const int> pc = ( auto_ptr<const int> )pi;
}
operator auto_ptr_ref<Other>
從 auto_ptr
轉換成 auto_ptr_ref
。
template <class Other>
operator auto _ptr _ref<Other>() throw();
傳回值
類型轉換運算符會傳回auto_ptr_refOther
>(*this)
<
。
範例
// auto_ptr_op_auto_ptr_ref.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class C {
public:
C(int _i) : m_i(_i) {
}
~C() {
cout << "~C: " << m_i << "\n";
}
C &operator =(const int &x) {
m_i = x;
return *this;
}
int m_i;
};
void f(auto_ptr<C> arg) {
};
int main()
{
const auto_ptr<C> ciap(new C(1));
auto_ptr<C> iap(new C(2));
// Error: this implies transfer of ownership of iap's pointer
// f(ciap);
f(iap); // compiles, but gives up ownership of pointer
// here, iap owns a destroyed pointer so the following is bad:
// *iap = 5; // BOOM
cout << "main exiting\n";
}
~C: 2
main exiting
~C: 1
release
這個成員會以 null 指標取代儲存的指標 myptr
,並傳回先前儲存的指標。
Type *release() throw();
傳回值
之前儲存的指標。
備註
這個成員會以 null 指標取代儲存的指標 myptr
,並傳回先前儲存的指標。
範例
// auto_ptr_release.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << (void*)this << " Value: " << x << endl;
};
~Int() {
cout << "Destructing " << (void*)this << " Value: " << x << endl;
};
int x;
};
int main()
{
auto_ptr<Int> pi(new Int(5));
pi.reset(new Int(6));
Int* pi2 = pi.get();
Int* pi3 = pi.release();
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6
reset
成員函式會評估表達式 delete myptr
,但只有在預存指標值 myptr
因函數調用而變更時。 然後會以 ptr
取代儲存的指標。
void reset(Type* ptr = 0);
參數
ptr
指定來取代預存指標的指標 myptr
。
範例
// auto_ptr_reset.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>
using namespace std;
class Int
{
public:
Int(int i)
{
x = i;
cout << "Constructing " << (void*)this << " Value: " << x << endl;
};
~Int()
{
cout << "Destructing " << (void*)this << " Value: " << x << endl;
};
int x;
};
int main()
{
auto_ptr<Int> pi(new Int(5));
pi.reset(new Int(6));
Int* pi2 = pi.get();
Int* pi3 = pi.release();
if (pi2 == pi3)
cout << "pi2 == pi3" << endl;
delete pi3;
}
Constructing 00311AF8 Value: 5
Constructing 00311B88 Value: 6
Destructing 00311AF8 Value: 5
pi2 == pi3
Destructing 00311B88 Value: 6