我自己的智能指针,双重免费或损坏(fasttop)

时间:2015-09-28 18:47:33

标签: c++ pointers copy-constructor smart-pointers dynamic-memory-allocation

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

#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()的大括号中删除),但我不知道如何处理它。

1 个答案:

答案 0 :(得分:1)

单一所有权智能指针实际上不具有采用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做什么。否则,你将不得不犯下每一个错误,并且很可能没有意识到大多数都是错误。