1

(おそらくプリプロセッサマクロを使用して)削除を呼び出すことができないことを除いて、通常のポインターのように(構文に関して)動作および動作するポインター型を構築することは可能ですか?

使用例:

borrowed_ptr<int> ptr = new int[42]; 

ptr[12] = 1;
cout<<ptr[12]<<endl; //prints 1

delete ptr; //error: no operator delete for borrowed_ptr<int>

borrowed_ptr<int> ptr2 = new int(2);
delete ptr2; //error

また、これも機能するはずです

template<typename t>
void func(borrowed_ptr<t> *arg)
{
   delete arg; //error
}

//somewhere else
int *t = new *int;
func(t);

ただし、「逆割り当て」は機能しません。

borrowed_ptr<int> foo = new int(2);
int* bar = foo; //error

Bored_ptr を宣言するときに * が必要かどうかは、私には関係ありません。コードが次のようになることが重要です

template <typename T>
void foo(T* whatever)
{
    //do something with whatever
   delete whatever; 
}

template <typename T>
void bar(T* whatever)
{
    //do something with whatever
}

次のように、このbored_ptrで呼び出すことができます:

borrowed_ptr<int> a = new int(2);
foo(a); //error, function tries to delete
bar(a); //fine, and has the same semantics as handing over a raw int*

注: ポインターの型が削除自体の場合、データを削除したくありません。他の誰かに属しているため、削除できない借用した ptr である必要があります。

4

7 に答える 7

0

Google で C++ のスマート ポインターのさまざまな実装を参照してください。利用可能な良い例がたくさんあります。

于 2013-01-27T18:03:49.097 に答える
0

あなたが本当に困っているのはstd::shared_ptrだと思います。

于 2013-01-27T18:04:24.970 に答える
0

unique_ptrその目的でa を使用できます。

unique_ptr<int[]> ptr(new int[10]);

を呼び出す必要はなく、delete[]呼び出すことはできませんdelete(カプセル化されたポインター型への暗黙的な変換はありません)。添え字演算子のオーバーロードが提供されます。

cout << ptr[1];
于 2013-01-27T18:04:57.773 に答える
0

delete演算子には組み込みのポインター型が必要なため、スマート ポインターならどれでもうまくいきます。通常のもののほとんどには、追加機能がいくつかありますが、必要な場合とそうでない場合があります。必要に応じて、独自に作成することは難しくありません。単項演算子*と演算子のオーバーロードを提供するクラスでポインターをラップするだけ->です。テンプレート化された疑似コピー コンストラクターと代入演算子は、暗黙的な型変換も提供できます。

于 2013-01-27T18:09:08.587 に答える
0

はい、使えますstd::unique_ptr。これに含めることを忘れないでください<memory>

#include <memory>

int main() {
   std::unique_ptr<int[]> a(new int[2] {1, 2, ...});

   a[1]; // 2
}
于 2013-01-27T18:10:17.240 に答える