我自己的智能指针,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
什么该做。否则,您将不得不犯每一个错误,而且很可能没有意识到其中大部分都是错误。
我想编写简单的智能指针,但遇到了问题。这只是代码的一部分,但我在这里发现了问题:
#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
什么该做。否则,您将不得不犯每一个错误,而且很可能没有意识到其中大部分都是错误。