test.exe中0x00418c38处的未处理异常:0xC0000005:访问冲突读取位置0xfffffffc

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

Mat*_*Mat 5

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 ++信号表明这些行有些可疑.