我自己的智能指针,double free or corruption (fasttop)

My own Smart pointer, double free or corruption (fasttop)

我想编写简单的智能指针,但遇到了问题。这只是代码的一部分,但我在这里发现了问题:

#include <iostream>

using namespace std;

class Number{
  public:
    Number(){}
    Number(float value):_value(value){cout << "Creating Object\n";}
    ~Number(){cout << "Destroying Object\n";}
  private:
    float _value;
  }; 

  class Smart_ptr {
  public:
   Smart_ptr(){}
   Smart_ptr(Number* other):Ptr(other){}
   Smart_ptr(const Smart_ptr &other):Ptr(other.Ptr){} // PROBLEM !!!
   Smart_ptr& operator=(Smart_ptr& other){
     if(this!=&other)
     {
       if(Ptr!=NULL)delete Ptr; // is that properly writen ?
       Ptr=other.Ptr;
       other.Ptr=NULL;
     }
     return *this;
   }
   ~Smart_ptr(){if(Ptr!=NULL) delete Ptr;}
  private:
    Number* Ptr;
 };

 int main(){

  Smart_ptr number5 = new Number (5); // <--- Creating Object
  {
    Smart_ptr number6 = number5;
  }                             // <--- Destroying Object

  std::cout<<"END"<<std::endl;  
 }

我应该得到这样的输出:

Creating Object
Destroying Object
END

但是我得到了双重释放或损坏(fasttop)和内存映射错误。 我知道问题是双删number5(应该删掉main()里面的大括号)但是不知道怎么处理。

单一所有权智能指针不能真正具有采用 const 引用的构造函数。由于只有一个智能指针可以拥有该对象,因此必须是原始智能指针或新智能指针拥有该对象。由于原始智能指针当前拥有该对象并且是const,因此它必须在之后拥有该对象,新的智能指针没有任何东西可以拥有。

您可能想要更改:

   Smart_ptr(const Smart_ptr &other):Ptr(other.Ptr){} // PROBLEM !!!

   Smart_ptr(Smart_ptr &other):Ptr(other.Ptr){ other.Ptr = NULL; }

但是,我求求你,请不要这样做。停下来。使用智能指针可能犯的每一个错误都可能已经犯过。如果你想自己做,请先研究 auto_ptr 什么不该做,unique_ptr/shared_ptr 什么该做。否则,您将不得不犯每一个错误,而且很可能没有意识到其中大部分都是错误。