C++ - 使用引用计数的基本垃圾收集器
C++ - Basic garbage collector using reference counting
好的,我正在尝试使用引用计数的概念在 C++ 中实现一个垃圾收集器(一个非常基本的收集器),它可以工作,但有些东西我不明白。
我有两个 classes:
一个 class 称为 GC,基本上它所做的只是递增和递减引用计数器
一个名为 TObject 的 class 扮演智能指针的角色(我重载了 * 和 -> 运算符,还有 = 运算符)
这是下面的代码:
GC.cpp
#include <iostream>
using namespace std;
class GC {
public:
GC(){
this->refCount = 0;//Initialisation du compteur à zero
}
void incrementRef(){
this->refCount++;//Incrémentation du compteur de references
}
int decrementRef(){
return this->refCount--;//Décrementation du compteur de references
}
int getCounter(){//Getter du compteur de references
return refCount;
}
~GC(){}
private:
int refCount; //Compteur de references
};
TObject.cpp:
#include <iostream>
#include "GC.cpp"
using namespace std;
template <class T>
class TObject {
T *p;
GC *gc;
public:
TObject(T *p){
cout<<"refobject"<<endl;
this->p = p;
gc = new GC();
this->gc->incrementRef();
}
virtual ~TObject(){//Destructeur
cout<<"delete TObject"<<endl;
if(this->gc->decrementRef() == 0){
delete p;
delete gc;
}
}
T* operator->(){//Surcharge de l'opérateur d'indirection
return p;
}
T& operator*() const {//Surchage de l'opérateur
return *p;
}
TObject<T>& operator=(const TObject<T> &t){
if(this->gc->decrementRef() == 0){
delete p;
delete gc;
}
this->p = t.p;
this->gc = t.gc;
this->gc->incrementRef();
return *this;
}
GC getGC(){
return *gc;
}
};
这是我在 main 中测试它的方式:
TObject<int> t(new int(2));
cout<<"t1 counter: "<<t.getGC().getCounter()<<endl;//Displays 1
TObject<int> t2(NULL);
cout<<"t2 counter: "<<t2.getGC().getCounter()<<endl;//Displays 1
t2 = t;
cout<<"t1 counter: "<<t.getGC().getCounter()<<endl;//Displays 2, why?
cout<<"t2 counter: "<<t2.getGC().getCounter()<<endl;//Displays 2
我不明白,我在 t2 中复制了 t 而我没有更新 t1!为什么它的引用计数器也更新了?
这是因为,t 和 t2 共享同一个 gc 实例。查看您的重载 = 运算符方法:-
TObject<T>& operator=(const TObject<T> &t)
{
if(this->gc->decrementRef() == 0)
{
delete p;
delete gc;
}
this->p = t.p;
this->gc = t.gc; // you are using same gc. Instead, you must be using
// this->gc = new GC();
this->gc->incrementRef();
return *this;
}
好的,我正在尝试使用引用计数的概念在 C++ 中实现一个垃圾收集器(一个非常基本的收集器),它可以工作,但有些东西我不明白。
我有两个 classes:
#include <iostream>
using namespace std;
class GC {
public:
GC(){
this->refCount = 0;//Initialisation du compteur à zero
}
void incrementRef(){
this->refCount++;//Incrémentation du compteur de references
}
int decrementRef(){
return this->refCount--;//Décrementation du compteur de references
}
int getCounter(){//Getter du compteur de references
return refCount;
}
~GC(){}
private:
int refCount; //Compteur de references
};
TObject.cpp:
#include <iostream>
#include "GC.cpp"
using namespace std;
template <class T>
class TObject {
T *p;
GC *gc;
public:
TObject(T *p){
cout<<"refobject"<<endl;
this->p = p;
gc = new GC();
this->gc->incrementRef();
}
virtual ~TObject(){//Destructeur
cout<<"delete TObject"<<endl;
if(this->gc->decrementRef() == 0){
delete p;
delete gc;
}
}
T* operator->(){//Surcharge de l'opérateur d'indirection
return p;
}
T& operator*() const {//Surchage de l'opérateur
return *p;
}
TObject<T>& operator=(const TObject<T> &t){
if(this->gc->decrementRef() == 0){
delete p;
delete gc;
}
this->p = t.p;
this->gc = t.gc;
this->gc->incrementRef();
return *this;
}
GC getGC(){
return *gc;
}
};
这是我在 main 中测试它的方式:
TObject<int> t(new int(2));
cout<<"t1 counter: "<<t.getGC().getCounter()<<endl;//Displays 1
TObject<int> t2(NULL);
cout<<"t2 counter: "<<t2.getGC().getCounter()<<endl;//Displays 1
t2 = t;
cout<<"t1 counter: "<<t.getGC().getCounter()<<endl;//Displays 2, why?
cout<<"t2 counter: "<<t2.getGC().getCounter()<<endl;//Displays 2
我不明白,我在 t2 中复制了 t 而我没有更新 t1!为什么它的引用计数器也更新了?
这是因为,t 和 t2 共享同一个 gc 实例。查看您的重载 = 运算符方法:-
TObject<T>& operator=(const TObject<T> &t)
{
if(this->gc->decrementRef() == 0)
{
delete p;
delete gc;
}
this->p = t.p;
this->gc = t.gc; // you are using same gc. Instead, you must be using
// this->gc = new GC();
this->gc->incrementRef();
return *this;
}