我实现了一个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/

10-13 05:32