数组中的SIGABRT c++如何转向<vector>

SIGABRT in arrays c++ how to turn to <vector>

本文关键字:lt vector gt 何转 SIGABRT c++ 数组      更新时间:2023-10-16

我有一个大项目,其中包括几个源文件和头文件。为了把一些变量放在一起,我使用了struct。然而,在我的项目中,我不时会遇到各种数组的SIGABRT错误。我检查了一下网络,我发现我想我必须把它们转到<vector>。如果你们有其他想法,我真的很想听。这是错误事件:

http://i.hizliresim.com/gnGDdR.png

以下是我的structs及其源文件:tools.h:

#ifndef _TOOLS_H_
#define _TOOLS_H_
void initialization(int,int,int);
int createGraph(int);
void orderDegree(int);
int nextTime(float lambda,int timeslots,int PU_number);
struct cognitiveRadio
{
    int **followed;
    double *priority;
    double *demand;
    int *degree;
    bool *assigned;
};
struct Graph
{
    int **adj;
    int *degree;
};
struct timeMatrix
{
    double **value;
};
#endif

我在tools.h中定义了它们,我在tools.cpp中使用的第一个定义是全局的:

cognitiveRadio myCR;
Graph myGraph;
timeMatrix myMatrix;

但是,我也需要在其他源文件中使用它们。因此,我在每个其他源文件中添加了以下行:

extern struct Graph myGraph;
extern struct cognitiveRadio myCR;
extern struct timeMatrix myMatrix;

我这样分配它们:(这个在tools.cpp中)

myMatrix.value=new double*[PU_number];
for( i=0;i<PU_number;i++)
    myMatrix.value[i]=new double[time_slots];

项目中还有另一个阵列,如下所示:

void orderDegree(int CR_Number)
{
    int *degreeOrdered;
    degreeOrdered=new int[CR_Number];
....
}

以下是其他头文件:

HyperHeuristic.h:

#ifndef _HYPERHURISTIC_H_
#define _HYPERHURISTIC_H_
#include "tools.h"
/*********Hyper-Heuristics*************/
double hyperheuristic(int ColumnIndex,int CR_Number,int PU_number,int hh,int accCriteria,int ts);
double simple_random(int ColumnIndex,int CR_Number,int PU_number,int ts);
double AICS(int ColumnIndex,int CR_Number,int PU_number,int ts);
double executeLLHorder(int ColumnIndex,int *LLHorder,int CR_Number,int PU_number,int ts);
/*********Low Level Heuristics***********/
int *largestDegree(int ColumnIndex,int CR_Number,int PU_number, Graph myGraph,int **CRs,int *PUs);
int *maxRadius(int ColumnIndex,int CR_Number,int PU_number, Graph myGraph,int **CRs,int *PUs);
int *maxDemand(int ColumnIndex,int CR_Number,int PU_number, Graph myGraph,int **CRs,int *PUs);
int *maxPriority(int ColumnIndex,int CR_Number,int PU_number, Graph myGraph,int **assignmentTable,int *availablePUs);
int *justRandom(int ColumnIndex,int CR_Number,int PU_number, Graph myGraph,int **CRs,int *PUs);
void print(double **arr);
struct ACO
{
    int *LLH;
    double deltatau;
};
struct AICStools
{
    double **probability;
    double **tau;
    double *roulette_wheel;
};
#endif // _HYPERHURISTIC_H_

fitness.h:

#ifndef _FITNESS_H_
#define _FITNESS_H_
double fitnessCalc(int**CRs,int CR_Number,int ColumnIndex,int PU_Number,int ts);
#endif

在main.cpp中,我有这个:

int time_slots=nextTime(1,number_of_packets,PU_number);
initialization(PU_number,CR_Number,time_slots);
for(int i=0;i<2;i++)
{
    double x=hyperheuristic(i,CR_Number,PU_number,hh,accCriteria,time_slots);
    cout<<"Fitness value of time("<<i<<"): "<<(double)x<<endl;
}

正如你所看到的,这是非常复杂的。但简单地说,函数调用的顺序是这样的:

  • main.cpp从你在上面看到的hyperheuristic.cpp调用HyperHeuristic()

  • hyperheuristic()调用同一源文件中的AICS()

  • AICS()在同一源文件中调用`executeLHorder()É

  • executeLLHorder()调用了一些低级启发式,你可以在ÉÉhyperheptist.h 中看到它们

  • 然后,executeLLHorder()再次从Éfitness.cpp 调用fitnesscalc()

然而,我之前说过,有时它工作得很好,但有时它会为项目中的各种数组返回SIGABRT错误。没有任何特定的数组。它就是这么做的。分配这些数组的最佳方式是什么?尤其是CCD_ 15s?

我想我必须把它们变成矢量

您的代码很容易出错,现在通常建议不要使用裸newdelete。您应该将您的分配封装在vector<T>unique_ptr<T>shared_ptr<T>中。

例如:

struct timeMatrix {
    double **value;
};
myMatrix.value=new double*[PU_number];
for( i=0;i<PU_number;i++)
    myMatrix.value[i]=new double[time_slots];

可能变成这样:

struct timeMatrix {
    std::vector< std::vector<double> > values;
};
myMatrix.values.resize(PU_number);
for(i = 0; i < PU_number; i++)
    myMatrix.values[i].resize(time_slots);

此:

void orderDegree(int CR_Number)
{
    int *degreeOrdered;
    degreeOrdered=new int[CR_Number];
....
}

可能变成这样:

void orderDegree(int CR_Number)
{
    std::unique_ptr<int[]> degreeOrdered;
    degreeOrdered.reset(new int[CR_Number]);
....
}

一旦您将分配打包到具有自动存储持续时间的对象中,您将能够更好地发现错误。例如,使用vector<T>,如果尝试访问超出范围的元素,则会得到失败的断言。

http://www.cplusplus.com/reference/vector/vector/http://www.cplusplus.com/reference/memory/unique_ptr/http://www.cplusplus.com/reference/memory/shared_ptr/