当前位置: 首页 > 知识库问答 >
问题:

C++析构函数解分配失败

羊舌阎宝
2023-03-14

在下面的C++代码中,在析构函数调用期间,它会崩溃,并出现以下错误。

如果打印了这条消息,至少程序还没有崩溃!但您可能还想打印其他诊断消息。DSCodes(16782,0x1000EFE00)malloc:***对象0x10742E2F0错误:未分配释放的指针DSCodes(16782,0x1000EFE00)malloc:***在malloc_error_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;
}

共有2个答案

阴禄
2023-03-14

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

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

蔚和风
2023-03-14

在Pair::Pair(const Pair&obj)中,实际上复制了指针,它是双倍析构的。您希望复制指针的内容(请参阅pair::pair(int p1,int p2)构造函数)。

 类似资料:
  • 与《 构造函数》类似,C# 中的析构函数(也被称作“终结器”)同样是类中的一个特殊成员函数,主要用于在垃圾回收器回收类实例时执行一些必要的清理操作。 C# 中的析构函数具有以下特点: 析构函数只能在类中定义,不能用于结构体; 一个类中只能定义一个析构函数; 析构函数不能继承或重载; 析构函数没有返回值; 析构函数是自动调用的,不能手动调用; 析构函数不能使用访问权限修饰符修饰,也不能包含参数。 析

  • 主要内容:析构函数的执行时机创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。 析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个 符号。 注意:析构函数没有参数,

  • C++ 类 & 对象 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地理解构造函数的概念:#include <iostream> using namespace std; class Line { public: v

  • 本文向大家介绍C++ explicit构造函数实例解析,包括了C++ explicit构造函数实例解析的使用技巧和注意事项,需要的朋友参考一下 按照C语言默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: 但是有的时候可能会不需要这种隐式转换,如下: 下面两种写法比较正常: 下面两种写法就比较疑惑了: s4 和s5 分别把一个int型和

  • 本文向大家介绍详解C++中虚析构函数的作用及其原理分析,包括了详解C++中虚析构函数的作用及其原理分析的使用技巧和注意事项,需要的朋友参考一下 C++中的虚析构函数到底什么时候有用的,什么作用呢。 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的

  • 本文向大家介绍C++中构造函数与析构函数的调用顺序详解,包括了C++中构造函数与析构函数的调用顺序详解的使用技巧和注意事项,需要的朋友参考一下 前言 在使用构造函数和析构函数时,需要特别注意对它们的调用时间和调用顺序。在一般情况下,调用析构函数的次序正好与调用构造函数的次序相反:最先被调用的构造函数,其对应的(同一对象中的)析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。