我想写我的简单智能指针,但我遇到了问题。这只是代码的一部分,但我在这里发现了问题:
#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()
的大括号中删除),但我不知道如何处理它。
答案 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
做什么。否则,你将不得不犯下每一个错误,并且很可能没有意识到大多数都是错误。