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