这是一个类对象排序的问题,为了验证我的类以及排序没问题,我先把问题点注释运行。
结果没问题,现在我取消24,26,27行的注释(不取消25行),这是一个类的析构函数。
运行sort函数,对用了一堆的类析构函数然后排序。如果我在类的析构函数中释放指针,取消注释25行。结构如下:
#include
#include
#include
#include
using namespace std;
int random(int mi,int ma){
return rand()%(ma-mi+1)+mi;
}
struct A{
int b;
};
bool op(A a,A b){
return a.bclass Stu{
public:
int b;
int *c;
Stu(){
b=random(0,100);
c=new int;
*c=random(0,100);
}
~Stu(){
delete c;
cout<<"析构"<bool op2(Stu a,Stu b){
return a.b//bool op3(Stu a,Stu b){
// return a.a[0].b
//}
bool op4(Stu a,Stu b){
return *(a.c)<*(b.c);
}
int main(){
srand(time(NULL));
//A *a=new A[10];
Stu *s=new Stu();
Stu *a=new Stu[10];
//for(int i=0;i<10;i++) cout<<*(a[i].c)<<" ";
//cout<
for(int i=0;i<10;i++) cout<" " ;
//for(int i=0;i<10;i++) cout<<*(a[i].c)<<" ";
cout<sort (a,a+10,op2);
for(int i=0;i<10;i++) cout<" ";
//for(int i=0;i<10;i++) cout<<*(a[i].c)<<" ";
cout<return 0;
}
0 0 52 8 78 0 15 81 23 30
析构
析构
free(): double free detected in tcache 2
已放弃 (核心已转储)
求解。问题:1.为什么sort会调用类的析构函数 2.如何去用sort排序含有析构对象的呢?
sort函数里面的op2函数
bool op2(Stu a,Stu b)
{
return a.b<b.b;
}
调用了两次Stu的赋值拷贝函数,如果题主把Stu的复制拷贝加上,会看到有两个复制拷贝构造,然后op2执行完,op2函数里面的Stu局部变量析构调用,sort源码是遍历排序,所有会有对应复制拷贝和析构产生;
因为op2(Stu a,Stu b)这里类型是Stu而不是指针,所以是实体拷贝,用完之后形参析构了