C++ 默认的sort排序问题

c++ 默认的sort排序问题,求解答

这是一个类对象排序的问题,为了验证我的类以及排序没问题,我先把问题点注释运行。

img


运行结果:

img

结果没问题,现在我取消24,26,27行的注释(不取消25行),这是一个类的析构函数。

img

运行sort函数,对用了一堆的类析构函数然后排序。如果我在类的析构函数中释放指针,取消注释25行。结构如下:

img

代码
#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而不是指针,所以是实体拷贝,用完之后形参析构了