0 c++ smart-pointers unhandled-exception
我已经实现了一个智能指针类,当我尝试编译时,它停在一个特定的行上,我得到这个消息: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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我还有一个*和&重载函数和一个复制构造函数.
它停在这里:
if (*mone==0)
Run Code Online (Sandbox Code Playgroud)
请你帮助我好吗??thaks
SmartPointer() : ptr(0), mone(0) //default constructor
{
int* mone = new int (1); // PROBLEM
}
Run Code Online (Sandbox Code Playgroud)
您正在声明mone构造函数内部调用的局部变量.这会使用相同的名称隐藏您的成员变量.因此,您的成员变量初始化为0(来自初始化列表),但从未设置为指向任何内容.
请改用:
mone = new int (1);
Run Code Online (Sandbox Code Playgroud)
或直接这样做:
SmartPointer() : ptr(0), mone(new int(1)) {}
Run Code Online (Sandbox Code Playgroud)
陈述*mone++;和*mone--;那里的陈述不会做他们做的事情.后缀增量/减量应用于指针,而不是它指向的东西.即它们被解析为:
*(mone++);
Run Code Online (Sandbox Code Playgroud)
你需要parens:
(*mone)++;
Run Code Online (Sandbox Code Playgroud)
确保你已经将你的编译器警告打开到最大值,clang和g ++信号表明这些行有些可疑.