作为一个即将毕业还没毕业的学生,我以前感叹于C++的无法驾御,去学习了java,觉得java的继承和内存管理比C++方便太多了,曾经赞叹过java是多么的友好,多么的完美,但是最近我因为工作原因,又回来重新学习了C++,认真的把C++和java做了一个细致的对比,java用她内建的机制帮我们解决了很多在C++里容易引起致命错误的问题,比如取消了类之间的多继承,以及为了支持多继承对接口特性的支持,以及运行在后台的垃圾回收线程,以及取消了指针.不得不承认java采取了很聪明的解决方法解决了C++里面那些对于初学者最棘手的问题,就好比是一台傻瓜相机,是很方便,但是也限制了我们的一些使用.java能实现的东西C++都可以实现,反之不然,C++的灵活性让我折服,虽然特性至多让人畏惧,但是我是如此想领略她真正的美丽以至于那些畏惧已经不存在了.
我前一段时间一直在思考一个问题,C++里的多继承问题至少新手可以模拟java的方式来完美解决,但是垃圾回收呢?或者内存重复释放呢?怎么解决??
java有垃圾回收线程?但是我情爱的C++呢?给她装上垃圾回收器岂不是让她强大并且温柔?
其实正像我说的java做到的C++都能做到,我在网上找了点资料看了一下,为C++设计了基于引用技术原理的垃圾回收器,虽然也许还很不完善,但是我还是觉得这才是一个真正的程序员想做的和需要做的真正有意义的事情,我准备再整理一下然后写出来,毕竟这个问题解决了,C++就变得很温顺,我已不再认为java更友好,刚好相反,现在是C++
namespace wang{
template<class T>
class shared_ptr; //声明一个类这个类是存储并管理指向资源的类的指针
template<class T>
class shared_data//这个类管理指向资源的指针
{
private:
friend class shared_ptr<T>;
explicit shared_data(T* pT):_M_ptr(pT) { //初始化,将引用计数变为1
_M_nCount = 1;
}
~shared_data() { //析构函数直接释放了所管理的内存
delete _M_ptr;
}
void operator++ () {
++_M_nCount;
}
operator-- () { //当引用计数最后变成0时直接将本对象已经所管理的内存释放
--_M_nCount;
if (_M_nCount == 0) {
delete this;
}
}
T& operator* () const {
return *_M_ptr;
}
T* operator-> () const {
return _M_ptr;
}
bool operator== (T* pT) const {
return _M_ptr == pT;
}
T* get() {
return _M_ptr;
}
int use_count() {
return _M_nCount;
}
private:
T* _M_ptr; 指向所管理的资源
unsigned int _M_nCount;//用来计算现在有几个指针在引用的资源
};
template<class T>
class shared_ptr
{
typedef shared_data<T> element; //所指向的管理内存的那个类
public:
explicit shared_ptr(T* pT):_M_pD(NULL) {
_M_pD = new element(pT); //管理内存的那个类
}
explicit shared_ptr():_M_pD(NULL){
}
// copy constructor
shared_ptr(const shared_ptr<T>& rT) {
_M_pD = rT.get_element();
if (_M_pD != NULL) {
++(*_M_pD);
}
}
~shared_ptr() {
if (_M_pD != NULL) {
--(*_M_pD);
}
}
// assignment operator
shared_ptr<T>& operator = (shared_ptr<T>& rT) {
if (_M_pD != NULL) {
--(*_M_pD);
}
_M_pD = rT.get_element();
if (_M_pD != NULL){
++(*_M_pD);
}
return *this;
}
T& operator* () const {
return _M_pD->operator *();
}
T* operator-> () const {
return _M_pD->operator ->();
}
bool operator== (shared_ptr<T>& rT) const {
return rT.get_element() == _M_pD;
}
bool operator== (T* pT) const {
if (_M_pD == NULL){
return pT == NULL;
}
return *_M_pD == pT;
}
T* get() {
if (_M_pD == NULL) {
return NULL;
}
else {
return _M_pD->get();
}
}
void release() {
if (_M_pD != NULL) {
--(*_M_pD);
_M_pD = NULL;
}
}
void reset(T* pT) {
if (_M_pD != NULL) {
--(*_M_pD);
_M_pD = NULL;
}
_M_pD = new element(pT);
}
private:
element* get_element()const {
return _M_pD;
}
element* _M_pD;
};
}