I've received a task in my university, which is to write a smart pointer. I need to upload the code to their server which runs some automated tests on it, and I've got only one error: memory access problem (null pointer or the like). Now I'am suspicious of my *, -> operator overloadings, which I think could crash if my raw_pointer would be NULL and I've tried NULL guarding them but then again I don't know what to return if this is the case. If this is not the case, then I really am helpless in this situation.
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;
}
}
};
When I do something like this:
// T = refcounted
my_pointer<refcounted> obj1;
refcounted p = *obj1;
My program exits with exit code -1073741819 (0xC0000005). Thanks in advance!