在 C++ 中对对进行排序时出现内存错误

Posted

技术标签:

【中文标题】在 C++ 中对对进行排序时出现内存错误【英文标题】:Getting Memory error while sorting pairs in C++ 【发布时间】:2013-04-19 07:14:45 【问题描述】:

我正在尝试按 i 的值对对 (struct pairs int i; int j; ) 进行排序。排序后,我想存储对应的 j 数量最多的对。 即 (1,3),(1,4),(2,5),(2,6),(2,7)。 我有一个结构 els(int *i,int *j,int count),els[0] 应该有 2,5,,2,6,,2,7,,其中 2 将存储在 i,5,6 j.els[1] 中的 ,​​7 将有 1,它的对应项。 在结构 els 中,当我使用对结构时,代码 os 运行良好,但是当我要使用两个单独的数组 i,j 时,我得到了 assert() coredumped 错误。

#include<iostream>
#include<time.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct pairs

    int i;
    int j;
;
struct els

        int *i;
    int *j;
    int count;
;
void sortpairs(struct pairs *p,int count);
void sortj(struct pairs *p,int count);
void swapp(struct pairs *p,struct pairs *q);
int random(int min,int max);
int elina(int el,int arr[],int siz);

int main()

    struct pairs *pp = new struct pairs[10];
    srand(time(0));
    for(int i = 0;i<10;i++)
    
        pp[i].i = random(0,10);
        pp[i].j = random(0,10);
    
    std::cout <<"BEFORE\n";
    for(int i = 0;i<10;i++)
    
        std::cout << pp[i].i <<"       "<<pp[i].j<<"\n";
    
    sortj(pp,10);
    std::cout << "Done Sorting\n";
    std::cout <<"AFTER\n";
    for(int i = 0;i<10;i++)
    
        std::cout << pp[i].i <<"       "<<pp[i].j<<"\n";
    
    sortpairs(pp,10);


    return 0;


void swapp(struct pairs *p,struct pairs *q)

    struct pairs temp;
    temp = *p;
    *p = *q;
    *q = temp;


int random(int min,int max)

    int n;
    n = rand()%(max - min) + min;
    return n;


int elina(int el,int arr[],int siz)

    for(int i = 0 ;i < siz;i++)
    
        if(arr[i] == el)
            return i;
    
    return -9;


void sortj(struct pairs *p,int count)

for(int i = 0 ; i < count - 1;i++)
    for(int j = i + 1;j < count;j++)
    
        if(p[i].i > p[j].i)
            swapp(&p[i],&p[j]);
    


void sortpairs(struct pairs *p,int count)

    int *arr = new int[count];
    int unqc = 0,az = 0,t;
    int  i;
    for(i = 0; i< count ;i++)
    
        arr[i] = p[i].i;
        if(t = elina(arr[i],arr,i) < 0)
            unqc++;
    
    az = i;
    std::cout <<"The Unique Elements are "<<unqc<<"\n";
    struct els *e = new struct els[unqc];
    int ec = 0;
    //e[0].i = new struct pairs[10];
    e[0].i = new int[10];
    e[0].j = new int[10];
    e[0].count = 0;
    for(int j = 0 ; j < count;j++)  
    
        if(j > 0)
        
            if(p[j].i == p[j-1].i)
            
            //e[ec].p[count].i = p[j].i;
            //e[ec].p[count].j = p[j].j;
            e[ec].i[count] = p[j].i;
            e[ec].j[count] = p[j].j;
            e[ec].count++;
            
            else
            
            ec++;
            //e[ec].p = new struct pairs[10];
            e[ec].i = new int[10];
            e[ec].j = new int[10];
            e[ec].count = 0;
            //e[ec].p[count].i = p[j].i;
            //e[ec].p[count].j = p[j].j;
            e[ec].i[count] = p[j].i;
            e[ec].j[count] = p[j].j;
            e[ec].count++;
            
        
        else
        
            //e[ec].p[count].i = p[j].i;
            //e[ec].p[count].j = p[j].j;
            e[ec].i[count] = p[j].i;
            e[ec].j[count] = p[j].j;
            e[ec].count++;
        
    
    for(int j = 0 ; j < unqc;j++)
    
        std::cout << e[j].count <<"\n";
    

【问题讨论】:

int *arr = new int[count];结构 els *e = 新结构 els[unqc];不被删除。每个新的都应该删除 您是否仅限于这些数据类型?如果没有,我可以推荐一个使用地图和列表/向量的解决方案,可以得到相同的结果 【参考方案1】:

在不同的地方

        e[ec].i[count] = p[j].i;
        e[ec].j[count] = p[j].j;

应该是

        e[ec].i[e[ec].count] = p[j].i;
        e[ec].j[e[ec].count] = p[j].j;

如果您使用std::vector 而不是new,那么您会发现这段代码更容易编写,并且错误和限制更少。

【讨论】:

谢谢,我忽略了这一点。

以上是关于在 C++ 中对对进行排序时出现内存错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 pypyodbc 和 pandas 加载 1GB .accdb 时出现内存错误

使用 QNetworkManager 时出现内存访问错误

电脑关机时出现内存错误

使用 Numba 进行矩阵乘法时出现 CUDA 内存不足错误

在 scipy 中计算成对距离时出现内存错误

将小 PySpark DataFrame 写入镶木地板时出现内存错误