Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;析构函数取消分配失败 在C++代码下面,在析构函数调用期间,它会在下面的错误中崩溃。_C++_Destructor - Fatal编程技术网

c++;析构函数取消分配失败 在C++代码下面,在析构函数调用期间,它会在下面的错误中崩溃。

c++;析构函数取消分配失败 在C++代码下面,在析构函数调用期间,它会在下面的错误中崩溃。,c++,destructor,C++,Destructor,如果打印了此消息,至少程序还没有崩溃! 但您可能还需要打印其他诊断消息。 DSCodes(16782,0x1000efe00)malloc:**对象0x10742e2f0的错误:未分配要释放的指针 DSCodes(16782,0x1000efe00)malloc:**在malloc\u error\u break中设置一个断点以进行调试 有人能给我指出析构函数中的错误吗 class Pair { public: int *pa,*pb; Pair(int, int); Pair

如果打印了此消息,至少程序还没有崩溃! 但您可能还需要打印其他诊断消息。 DSCodes(16782,0x1000efe00)malloc:**对象0x10742e2f0的错误:未分配要释放的指针 DSCodes(16782,0x1000efe00)malloc:**在malloc\u error\u break中设置一个断点以进行调试

有人能给我指出析构函数中的错误吗

class Pair {
 public:
  int *pa,*pb;
   Pair(int, int);
   Pair(const Pair &);
  ~Pair();
 };
 
Pair::Pair(int p1, int p2)
{
    this->pa = new int;
    this->pb = new int;
    *pa = p1;
    *pb = p2;
}
Pair::Pair(const Pair &obj)
{
    this->pa= new int;
    this->pb = new int;
    this->pa = obj.pa;
    this->pb = obj.pb;
}
 
Pair::~Pair()
{
    if(pa)
        delete (pa);
    if(pb)
        delete(pb);
}
 /* Here is a main() function you can use
  * to check your implementation of the
  * class Pair member functions.
  */
  
int main() {
  Pair p(15,16);
  Pair q(p);
  Pair *hp = new Pair(23,42);
  delete hp;
  
  std::cout << "If this message is printed,"
    << " at least the program hasn't crashed yet!\n"
    << "But you may want to print other diagnostic messages too." << std::endl;
  return 0;
}
类对{
公众:
int*pa,*pb;
配对(int,int);
对(常数对&);
~Pair();
};
Pair::Pair(int p1,int p2)
{
这->pa=新的整数;
这->pb=新的整数;
*pa=p1;
*pb=p2;
}
对::对(常量对和对象)
{
这->pa=新的整数;
这->pb=新的整数;
这->pa=obj.pa;
这->pb=obj.pb;
}
配对::~Pair()
{
if(pa)
删除(pa);
如果(pb)
删除(pb);
}
/*下面是一个可以使用的main()函数
*检查您对
*类对成员函数。
*/
int main(){
p对(15,16);
对q(p);
配对*hp=新配对(23,42);
删除hp;

std::cout问题在于,复制构造函数将另一个对象的
p1
p2
分配给当前对象(
q
持有与
p
相同的
p1
p2
)因此,在程序结束时,
q
的析构函数和
p
的析构函数尝试删除两个相同的指针


在复制构造函数中,您应该复制整数,而不是只复制指针。

在Pair::Pair(const Pair&obj)中,您实际上复制了指针,该指针后来被双重析构函数。您希望复制指针的内容(请参阅Pair::Pair(int p1,int p2)构造函数).

请提醒自己
ptr=0
*ptr=0
之间的区别。为什么要对两个int使用动态分配?指向int的指针占用的空间至少与int本身一样大,这不需要内存分配的开销。除非您有很好的理由使用指针,
int a,b
应该是这样。这并不能解决问题,但这段代码可以写得简单得多。所有这些
This->
s只是噪音;编译器知道成员是什么。你可以在分配时进行初始化。所以
pa=new int(p1);
。实际上,这应该在初始化列表中:
Pair::Pair(int p1,int p2:pa(new int(p1),pb(new int(p2){}
。最后,在删除指针之前,您不需要测试空指针。因此
Pair::~Pair(){delete pa;delete pb;}
。谢谢,按下面的方式更改复制构造函数修复了它。Pair::Pair(const Pair&obj){this->pa=new int(*obj.pa);this->pb=new int(*obj.pb); }