C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++のポインター、スマートポインター、および共有ポインター


ポインタ

ポインタは、変数のアドレスを格納するために使用されます。

構文

Type *pointer;
」と入力します

初期化

Type *pointer;
Pointer = variable name;

機能

  • ポインタは変数のアドレスを格納するために使用されます。
  • ポインタにはnull値を割り当てることができます。
  • ポインタは参照渡しで参照できます。
  • ポインタには、スタック上に独自のメモリアドレスとサイズがあります。

#include <iostream>
using namespace std;
int main() {
   // A normal integer variable
   int a = 7;
   // A pointer variable that holds address of a.
   int *p = &a;
   // Value stored is value of variable "a"
   cout<<"Value of Variable : "<<*p<<endl;
   // It will print the address of the variable "a"
   cout<<"Address of Variable : "<<p<<endl;
   // reassign the value.
   *p = 6;
   cout<<"Value of the variable is now: "<<*p<<endl;
   return 0;
}

出力

Value of Variable : 7
Address of Variable : 0x6ffe34
Value of the variable is now: 6

C++のスマートポインタ

スマートポインタは、ファイル処理やネットワークソケットなどのメモリ管理として使用できるように通常のポインタを作成できる抽象データ型であり、自動破棄や参照カウントなどの多くのことを実行できます。

C ++のスマートポインタは、テンプレートクラスとして実装できます。テンプレートクラスは、*および->演算子でオーバーロードされます。 auto_ptr、shared_ptr、unique_ptr、weak_ptrは、C++ライブラリで実装できるスマートポインタの形式です。

#include<iostream>
using namespace std;
// A generic smart pointer class
template <class T>
class Smartpointer {
   T *p; // Actual pointer
   public:
      // Constructor
      Smartpointer(T *ptr = NULL) {
         p = ptr;
      }
   // Destructor
   ~Smartpointer() {
      delete(p);
   }
   // Overloading dereferencing operator
   T & operator * () {
      return *p;
   }
   // Overloding arrow operator so that members of T can be accessed
   // like a pointer
   T * operator -> () {
      return p;
   }
};
int main() {
   Smartpointer<int> p(new int());
   *p = 26;
   cout << "Value is: "<<*p;
   return 0;
}

出力

Value is: 26

C++での共有ポインタ

shared_ptrは、C++ライブラリで実装できるスマートポインタの形式の1つです。これは、生のポインターと参照カウント(オブジェクト、メモリブロック、ディスクスペース、その他のリソースなどのリソースへの参照、ポインター、またはハンドルの数を格納する手法)のコンテナーであり、含まれているポインターの所有構造が連携して機能します。 shared_ptrのすべてのコピーを使用します。

含まれているrawポインタによって参照されるオブジェクトは、すべてのコピーがshared_ptrから破棄された場合にのみ破棄されます。

#include<iostream>
#include<memory>
using namespace std;
int main() {
   shared_ptr<int> ptr(new int(7));
   shared_ptr<int> ptr1(new int(6));
   cout << ptr << endl;
   cout << ptr1 << endl;
   // Returns the number of shared_ptr objects
   // referring to the same managed object.
   cout << ptr.use_count() << endl;
   cout << ptr1.use_count() << endl;
   // Relinquishes ownership of ptr on the object
   // and pointer becomes NULL
   ptr.reset();
   cout << ptr.get() << endl;
   cout << ptr1.use_count() << endl;
   cout << ptr1.get() << endl;
   return 0;
}

出力

0xe80900
0xe80940
1
1
0
1
0xe80940

  1. スマートポインタとは何ですか?C ++でいつ使用する必要がありますか?

    スマートポインタは、「raw」(または「bare」)C++ポインタをラップするクラスです。ポインタが指すリソースを管理するために使用されます。たとえば、そのメモリ位置への参照が失われた場合。ガベージコレクターのように機能します。複数のスマートポインタタイプがあります。 ほとんどの場合、スマートポインタを使用する必要があります。これは、ポインタを使用する際の主な問題点が手動のメモリ管理とメモリリークであるためです。スマートポインタは、これらの両方を取り除こうとします。これらのいずれも実際には実行したくない場合は、スマートポインターを使用する必要があります。

  2. C ++のポインター変数と参照変数の違いは何ですか?

    参照 変数が参照として宣言されると、それは既存の変数の代替名になります。 構文 Type &newname = existing name; 初期化 Type &pointer; pointer = variable name; ポインタ ポインタは、変数のアドレスを格納するために使用されます。 構文 Type *pointer;」と入力します 初期化 Type *pointer; pointer = variable name; 参照とポインタの主な違いは- 参照は別の名前の既存の変数を参照するために使用されますが、ポインターは変数のアドレスを格納するために使