gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:38:20 26 4
gpt4 key购买 nike

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

#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 了解该做什么。否则,您将不得不犯每一个错误,而且很可能没有意识到其中大部分都是错误。

关于c++ - 我自己的智能指针,double free or corruption (fasttop),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com