这些会使我的程序崩溃吗?
Will any of these crash my program?
我在大学接到了一个任务,就是写一个智能指针。我需要将代码上传到他们的服务器上,服务器在上面运行一些自动化测试,我只遇到一个错误:内存访问问题(空指针等)。
现在我怀疑我的 *, -> 运算符重载,我认为如果我的 raw_pointer 为 NULL 可能会崩溃并且我已经尝试使用 NULL 来保护它们但是我又不知道要 return 如果是这种情况。如果不是这样,那我真的很无奈。
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)。提前致谢!
Class 实现看起来不错,但第二个代码块中有错误。
obj1 使用 NULL 指针初始化,在第二行中取消引用它并复制到新变量。所以它崩溃了。
您必须在取消引用之前为 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;
}
我在大学接到了一个任务,就是写一个智能指针。我需要将代码上传到他们的服务器上,服务器在上面运行一些自动化测试,我只遇到一个错误:内存访问问题(空指针等)。 现在我怀疑我的 *, -> 运算符重载,我认为如果我的 raw_pointer 为 NULL 可能会崩溃并且我已经尝试使用 NULL 来保护它们但是我又不知道要 return 如果是这种情况。如果不是这样,那我真的很无奈。
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)。提前致谢!
Class 实现看起来不错,但第二个代码块中有错误。
obj1 使用 NULL 指针初始化,在第二行中取消引用它并复制到新变量。所以它崩溃了。
您必须在取消引用之前为 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;
}