Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 双重自由或腐败C++;_C++_Memory Management_Queue_Malloc_Free - Fatal编程技术网

C++ 双重自由或腐败C++;

C++ 双重自由或腐败C++;,c++,memory-management,queue,malloc,free,C++,Memory Management,Queue,Malloc,Free,我得到了一个奇怪的错误,即使我调用free(),也会发生这个错误,它的用法是在一个名为dequeue的方法中,该方法从优先级队列中删除元素,该功能工作正常,但是当队列为空时,会抛出错误,而不是定义的错误消息 代码和错误如下: void enqueue(string item, long time) { cout<<"Please Enter Entry and Time of element you wish to enqueue.."<<endl

我得到了一个奇怪的错误,即使我调用free(),也会发生这个错误,它的用法是在一个名为dequeue的方法中,该方法从优先级队列中删除元素,该功能工作正常,但是当队列为空时,会抛出错误,而不是定义的错误消息

代码和错误如下:

void enqueue(string item, long time)
    {
        cout<<"Please Enter Entry and Time of element you wish to enqueue.."<<endl;
        PRecord *tmp, *q;
        tmp = new PRecord;
        tmp->entry = item;
        tmp->time = time;
        if(front==NULL){ //if queue is empty
            tmp->link = front;
            front = tmp;    
        }
        if(time<=front->time){ //if newer priority item comes through put it at front of queue
            tmp->link = front;
            front = tmp;    
        }

        else {
            q = front;
            while (q->link != NULL && q->link->time <= time)
                q=q->link;
            tmp->link = q->link;
            q->link = tmp;


        }
                   }

int dequeue()
        {try{
            PRecord *tmp; //pointer to front of queue

            if(front!=NULL){
                tmp = front;
                cout<<"Deleted item is: "<<endl;
                displayRecord(tmp); //outputs record details
                front = front->link; //link to the front

                free(tmp); //dealloc memory no longer used


            }
            else{
            cerr<<"Queue is empty - No items to dequeue!"<<endl;    
                }
        } catch(...){
            return(0);
        }

            }





*** glibc detected *** ./3x: double free or corruption (fasttop): 0x0000000000bb3040 ***
======= Backtrace: =========
/lib64/libc.so.6[0x35a8675dee]
/lib64/libc.so.6[0x35a8678c3d]
./3x[0x401275]
./3x[0x400f69]
/lib64/libc.so.6(__libc_start_main+0xfd)[0x35a861ed1d]
./3x[0x400d59]
======= Memory map: ========
00400000-00402000 r-xp 00000000 08:06 2623369                            /home/std/rc14lw/lab5excercisefinal/3x
00601000-00602000 rw-p 00001000 08:06 2623369                            /home/std/rc14lw/lab5excercisefinal/3x
00bb3000-00bd4000 rw-p 00000000 00:00 0                                  [heap]
35a8200000-35a8220000 r-xp 00000000 08:01 1310722                        /lib64/ld-2.12.so
void排队(字符串项,长时间)
{
coutlink=前端;
前端=tmp;
}
否则{
q=正面;
而(q->link!=NULL&&q->link->time link;
tmp->link=q->link;
q->link=tmp;
}
}
int dequeue()
{试试看{
PRecord*tmp;//指向队列前面的指针
如果(前!=NULL){
tmp=前部;

cout问题是您在列表中插入了两次第一个条目,然后删除了两次,这就是打印错误的时候

首先检查列表是否为空,如果为空,则添加新条目作为第一个条目。
然后将新条目的时间与第一条条目的时间进行比较,如果第一条条目是相同的条目,则再次插入该条目

换言之:您需要一个“else if”选项:

if(front==NULL){//if队列为空
tmp->link=前端;
前端=tmp;
}else如果(timetime){//link=front;
前端=tmp;
}

问题在于,您在列表中插入了第一个条目两次,然后删除了两次,此时会打印错误

首先检查列表是否为空,如果为空,则添加新条目作为第一个条目。
然后将新条目的时间与第一条条目的时间进行比较,如果第一条条目是相同的条目,则再次插入该条目

换言之:您需要一个“else if”选项:

if(front==NULL){//if队列为空
tmp->link=前端;
前端=tmp;
}else如果(timetime){//link=front;
前端=tmp;
}

当队列为空时,在添加第一个项目后,您应该从
排队
功能返回,没有它,您将
前面的
指向自身

解决方案:

       if(front==NULL)
       {   //if queue is empty
            tmp->link = front;
            front = tmp;    
            return; // <-- added
        }
然后检查以下条件
如果(timetime){
返回true,很明显,
time
是相等的,那么这一行

tmp->link = front;

使
front
指向自身,因为
tmp==front
front
不为空。这就是
dequeue
函数不工作的原因。

当队列为空时,在添加第一项后,您应该从
enqueue
函数返回,如果没有它,您将
front
指向自身

解决方案:

       if(front==NULL)
       {   //if queue is empty
            tmp->link = front;
            front = tmp;    
            return; // <-- added
        }
然后检查以下条件
如果(timetime){
返回true,很明显,
time
是相等的,那么这一行

tmp->link = front;

使
front
指向自身,因为
tmp==front
front
不为空。这就是为什么
dequeue
函数不起作用的原因。

为什么大拇指朝下?这个问题有所有的要求,并且清晰明了。您是如何分配和初始化预编码的?有没有合理的理由你选择malloc/free而不是new/delete?添加了我的enqueue方法来显示预编码的分配,当我使用delete时也有相同的行为。无论如何,你用
new
创建一个对象,然后用
free
解除分配。这是未定义的行为(它不会调用析构函数
~PRecord()
)现在,“ReululjaWa”有一些有趣的答案。但是在任何情况下,C++不是C。所以新的/删除的或新的[]/Dele[]和忘记MalCube()/For()。为什么不赞成?这个问题有所有的要求,而且清晰明了。你是如何分配和初始化你的预记录的?你为什么选择malloc/free而不是new/delete?有没有正当的理由?添加了我的排队方法来显示预记录的分配,我使用delete时也有同样的行为。无论如何,你创建了一个新< /代码>,然后用<代码>自由< /COD>进行解除分配。这是未定义的行为(它不调用析构函数<代码>预处理)< />代码>代替.t/ReulkaWA.S.RululjouLa。现在有一些有趣的答案。但是,在任何情况下,C++不是C。所以新建/删除或新建[]/DELL] ],忘记MalCube()/For()。。谢谢你的简明回答-完全有意义,我确实学到了一些东西!非常感谢!谢谢你的简明回答-完全有意义,我确实学到了一些东西!非常感谢!谢谢你的投入这可能也有用,但我先看到了拉菲克斯的答案。再次感谢你!@rahulchawla Su就编码风格而言,我会一直使用
return
,也就是说,在第一个
if
中不使用
return
,然后使用have
if..else
。谢谢你的输入,这可能也行得通,但我先看到了rafix的答案。再次感谢你!@rahulchawla当然。就编码风格而言,我会的然后始终使用
return
,即在第一个
if
中不使用
return
,然后使用have
if..else