这些会破坏我的程序吗?

时间:2015-11-02 00:00:27

标签: c++ pointers smart-pointers null-pointer

我在大学接到了一项任务,就是写一个智能指针。我需要将代码上传到他们的服务器上运行一些自动化测试,我只有一个错误:内存访问问题(空指针等)。 现在我怀疑我的*, - >运算符重载,我认为如果我的raw_pointer为NULL并且我已经尝试过NULL守护它们会崩溃,但是如果是这样的话我又不知道该返回什么。如果情况并非如此,那么在这种情况下我真的很无奈。

template<class T>
class my_pointer {
    T* raw_pointer;

public:
    my_pointer() : raw_pointer(NULL) { }

    my_pointer(T *pointer) : raw_pointer(pointer) {
        if(raw_pointer != NULL) raw_pointer->incRefCnt();
    }

    my_pointer(const my_pointer<T>& smart_pointer) : raw_pointer(smart_pointer.raw_pointer) {
        if(raw_pointer != NULL) raw_pointer->incRefCnt();
    }

    T& operator*() {
        return *raw_pointer;
    }

    T* operator->() {
        return raw_pointer;
    }

    operator T*() {
        return raw_pointer;
    }

    my_pointer<T> &operator=(const my_pointer<T> &smart_pointer) {
        if(this != &smart_pointer && raw_pointer != NULL) {
            if (raw_pointer->decRefCnt() == 0) {
                delete raw_pointer;
            }

            raw_pointer = smart_pointer.raw_pointer;
            raw_pointer->incRefCnt();
        }

        return *this;
    }

    bool operator== (const T* pointer) {
        return raw_pointer == pointer;
    }

    bool operator!= (const T* pointer) {
        return raw_pointer != pointer;
    }

    bool operator== (const my_pointer<T> &smart_pointer) {
        return raw_pointer == smart_pointer.raw_pointer;
    }
bool operator!= (const my_pointer<T> &smart_pointer) {
    return raw_pointer != smart_pointer.raw_pointer;
}

~my_pointer() {
     if(raw_pointer != NULL && raw_pointer->decRefCnt() == 0) {
         delete raw_pointer;
     }
}

};

当我做这样的事情时:

// T = refcounted
my_pointer<refcounted> obj1;    
refcounted p = *obj1;

我的程序以退出代码-1073741819(0xC0000005)退出。提前谢谢!

1 个答案:

答案 0 :(得分:2)

类实现看起来很好,但是你在第二个代码块中有错误。

使用NULL指针初始化obj1,在第二行中取消引用它并复制到新变量。它崩溃了。

您必须在取消引用之前将某些内容分配给obj1,或者将其检查为NULL。

例如像这样

// T = refcounted
refcounted p0;
my_pointer<refcounted> obj1(&p0);    
refcounted p = *obj1;

或者像这样

// T = refcounted
my_pointer<refcounted> obj1;
refcounted p;
if( obj1 != NULL )
{
    p = *obj1;
}