ABC
クラスを作成し、その3つのオブジェクトを通常の割り当ておよびコピーコンストラクタで作成しました。今は彼らはptr
の同じメモリアドレスを使用しています。他のオブジェクトでmomeryが使用されているときにptrを削除しない
これらのオブジェクトが削除されると、最初のオブジェクトが削除されてスコープから外れることを意味しますが、2番目にはメモリが既に削除されているというエラーが発生します。 これは問題ありません。私は理解している。
私は他のオブジェクトを使用しているときに、メモリを削除したくない、ということをやりたい#include<iostream>
using namespace std;
class ABC
{
private:
int a;
int *ptr;
public:
ABC(); // Simple constructor.
ABC(int a, int b); // Parameterized constructor.
ABC(const ABC &obj); // Copy constructor.
~ABC(); // Destructor.
void display(); // Display.
ABC& operator=(const ABC &obj); // Operator Overload.
};
ABC::ABC()
{
}
ABC::ABC(int a, int b)
{
cout << "Parameterized constructor" << endl;
// allocate memory for the pointer;
this->a = a;
ptr = new int;
ptr = &b;
}
ABC::ABC(const ABC &obj)
{
cout << "Copy constructor" << endl;
a = obj.a;
//ptr = new int;
//*ptr = *obj.ptr; // copy the value
ptr = obj.ptr;
}
ABC& ABC :: operator=(const ABC &obj)
{
cout <<"Assignemnt operator overload"<<endl;
this->a = obj.a;
this->ptr = obj.ptr;
return *this;
}
ABC::~ABC(void)
{
cout << "Freeing memory!" << endl;
delete ptr;
}
void ABC::display() {
cout << "a value = : " << a <<endl;
cout << "ptr value = : " << ptr <<endl;
cout << "*ptr value = : " << *ptr <<endl;
}
int main()
{
// Normal.
ABC obj1(1, 2);
cout << "Point Obj1 value = : "<<endl;
obj1.display();
cout<<"\n\n";
// Assignment.
ABC obj2;
obj2 = obj1;
cout << "Point Obj2 value = : "<<endl;
obj2.display();
cout<<"\n\n";
// Copy constructor.
ABC obj3(obj1);
cout << "Point Obj3 value = : "<<endl;
obj3.display();
return 0;
}
。どのようにスマートポインタでこれを処理するには、私はビルドせん断ポインタで行うしたくないです。 Smart Pointerクラスを作成し、他のオブジェクトが同じメモリを使用しているときにptr参照カウントを増やしたい。しかし、どのようにするか分からない。
class SmartPointer
{
public:
int *ptr;
int ref;
SmartPointer();
SmartPointer(int *p);
int& operator *();
~SmartPointer();
};
SmartPointer::SmartPointer()
{
cout<<"SmartPointerInitilaize default"<<endl;
ref = 1;
}
SmartPointer::SmartPointer(int *p)
{
cout<<"SmartPointerInitilaize para"<<endl;
ptr = p;
ref = 1;
}
int& SmartPointer:: operator *()
{
return *ptr;
}
SmartPointer::~SmartPointer()
{
cout<<"SmartPointer De-Initilaize"<<endl;
//delete ptr;
}
私はなぜあなたが再びホイールを発明したいのかわかりません。 まず最初に refカウンタが静的になる必要があります。 2番目のコンストラクタでインクリメントし、デストラクタでデクリメントします。 thrid、デストラクタでrefカウンタが0になると、あなたのpinterを解放する必要があります。 良い一日をお過ごしください – jamek
'static'参照カウンタを追加し、マルチスレッド環境で使用する場合はmutexなどでロックすることを忘れないでください。 – Unimportant
カウントに 'static'を使うのは誰ですか?コンストラクタを代入またはコピーしてオブジェクトが作成されているときに、リフカウントを増やしたいということです。 –