我实现了一个Smart Pointer类,当我尝试进行编译时,它停在了特定的行上,并得到以下消息:test.exe中0x00418c38的未处理异常:0xC0000005:访问冲突读取位置0xfffffffc。
我的代码是:
template <class T>
class SmartPointer
{
private:
T* ptr;
int* mone;
public:
SmartPointer() : ptr(0), mone(0) //default constructor
{
int* mone = new int (1);
}
SmartPointer(T* ptr2) : ptr(ptr2), mone(0)
{
int* mone = new int (1);
}
SmartPointer<T>& operator= (const SmartPointer& second) //assignment operator
{
if (this!= &second)
{
if (*mone==1)
{
delete ptr;
delete mone;
}
ptr = second.ptr;
mone = second.mone;
*mone++;
}
return *this;
}
~SmartPointer() // Destructor
{
*mone--;
if (*mone==0)
{
delete ptr;
delete mone;
}
}
};
我也有一个*和&重载函数和一个复制构造函数。
它在这里停止:
if (*mone==0)
请你帮助我好吗??塞克斯
最佳答案
SmartPointer() : ptr(0), mone(0) //default constructor
{
int* mone = new int (1); // PROBLEM
}
您在构造函数中声明了一个名为
mone
的局部变量。这将隐藏具有相同名称的成员变量。因此,您的成员变量使用0
进行了初始化(来自初始化程序列表),但从未设置为指向任何内容。使用此代替:
mone = new int (1);
或直接执行以下操作:
SmartPointer() : ptr(0), mone(new int(1)) {}
其中的语句
*mone++;
和*mone--;
不会执行您要执行的操作。后缀的增减适用于指针,而不是指针所指向的东西。即它们被解析为:*(mone++);
您需要括号:
(*mone)++;
确保已将编译器警告打开到最大,同时clang和g ++都表明这些行有些混乱。
关于c++ - test.exe中0x00418c38处未处理的异常:0xC0000005:访问冲突读取位置0xfffffffc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23842343/