*** glibc detected *** free():invalid pointer: [英] ***glibc detected*** free(): invalid pointer:

查看:157
本文介绍了*** glibc detected *** free():invalid pointer:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试运行我的代码时,我得到标题中的错误...
这是我正在运行

  class MyQueue {
tile * queue;
int size;
public:
MyQueue(int cap);
〜MyQueue();
void enqueue(tile t);
tile dequeue();
bool isEmpty();
};

void MyQueue :: enqueue(tile t){
queue [size] = t;
size ++;
}

tile MyQueue :: dequeue(){
tile temp = queue [0];
tile * victim = queue;
queue ++;
delete victim;
return temp;
}

bool MyQueue :: isEmpty(){
if(size == 0)
return true;
else
return false;
}

MyQueue :: MyQueue(int cap){
queue = new tile [cap];
size = 0;
}

MyQueue ::〜MyQueue(){
delete [] queue;
}

int main(int argc,char * argv []){
tile tile1; tile1.type ='1';
tile tile2; tile2.type ='2';
tile tile3;

MyQueue q(10);
q.enqueue(tile1);
q.enqueue(tile2);
tile3 = q.dequeue();
cout<< tile3.type<<= 1?<< endl;
return 0;
}

valgrind:

  == 4506 ==不匹配free()/ delete / delete [] 
== 4506 == at 0x4C27FFF:operator delete(void *)(vg_replace_malloc.c:387)
== 4506 == by 0x400CD2:MyQueue :: dequeue()(MyQueue.h:37)
== 4506 == by 0x400DD7:main(p1.cpp:24)
= = 4506 ==地址0x5964040是大小为120的块中的0字节alloc_d
== 4506 == at 0x4C28658:operator new [](unsigned long)(vg_replace_malloc.c:305)
= = 4506 == by 0x400D35:MyQueue :: MyQueue(int)(MyQueue.h:49)
== 4506 == by 0x400D9F:main(p1.cpp:21)
== 4506 ==
1 = 1?
== 4506 ==无效free()/ delete / delete []
== 4506 == at 0x4C27C7B:operator delete [](void *)(vg_replace_malloc.c:409)
== 4506 == by 0x400D74:MyQueue ::〜MyQueue()(MyQueue.h:54)
== 4506 == by 0x400E2F:main(p1.cpp:21)
== 4506 = =地址0x596404c是大小为120的块内的12个字节free'd
== 4506 == at 0x4C27FFF:operator delete(void *)(vg_replace_malloc.c:387)
== 4506 == by 0x400CD2:MyQueue :: dequeue()(MyQueue.h:37)
== 4506 == by 0x400DD7:main(p1.cpp:24)
== 4506 ==
== 4506 ==
== 4506 == HEAP SUMMARY:
== 4506 == in in exit:0 bytes in 0 blocks
== 4506 == total heap usage:1 allocs, 2释放,分配120字节
== 4506 ==
== 4506 ==所有堆块被释放 - 没有泄漏可能
== 4506 ==
== 4506 ==对于检测到的和抑制的错误的计数,重新运行:-v
== 4506 ==错误摘要:2个上下文中的2个错误(抑制:4从4)



似乎有点蠢,但我无法想象它的生活,感谢您的帮助


<这个问题可能是由于在构造函数中动态分配了一个数组:



<$>

p $ p> queue = new tile [cap];

但在 deque 非数组删除操作符。

  tile * victim = queue; 
queue ++;
delete victim;

它看起来像代码中的逻辑不匹配。一方面,有代码分配动态数组,但在其他地方它删除动态分配的数组的个别元素。


I get the error in the title when I try to run my code... here's what I'm running

class MyQueue {
    tile* queue;
    int size;
public:
    MyQueue(int cap);
    ~MyQueue();
    void enqueue(tile t);
    tile dequeue();
    bool isEmpty();
};

void MyQueue::enqueue(tile t) {
queue[size] = t;
size++;
}

tile MyQueue::dequeue() {
tile temp = queue[0];
tile* victim = queue;
queue++;
delete victim;
return temp;
}

bool MyQueue::isEmpty() {
if (size == 0)
    return true;
else
    return false;
}

MyQueue::MyQueue(int cap) {
queue = new tile[cap];
size = 0;
}

MyQueue::~MyQueue() {
delete[] queue;
}

int main(int argc, char *argv[]) {
tile tile1; tile1.type = '1';
tile tile2; tile2.type = '2';
tile tile3;

MyQueue q(10);
q.enqueue(tile1);
q.enqueue(tile2);
tile3 = q.dequeue();
cout<<tile3.type<<" =1?"<<endl;
return 0;
}

valgrind:

==4506== Mismatched free() / delete / delete []
==4506==    at 0x4C27FFF: operator delete(void*) (vg_replace_malloc.c:387)
==4506==    by 0x400CD2: MyQueue::dequeue() (MyQueue.h:37)
==4506==    by 0x400DD7: main (p1.cpp:24)
==4506==  Address 0x5964040 is 0 bytes inside a block of size 120 alloc'd
==4506==    at 0x4C28658: operator new[](unsigned long) (vg_replace_malloc.c:305)
==4506==    by 0x400D35: MyQueue::MyQueue(int) (MyQueue.h:49)
==4506==    by 0x400D9F: main (p1.cpp:21)
==4506== 
1 =1?
==4506== Invalid free() / delete / delete[]
==4506==    at 0x4C27C7B: operator delete[](void*) (vg_replace_malloc.c:409)
==4506==    by 0x400D74: MyQueue::~MyQueue() (MyQueue.h:54)
==4506==    by 0x400E2F: main (p1.cpp:21)
==4506==  Address 0x596404c is 12 bytes inside a block of size 120 free'd
==4506==    at 0x4C27FFF: operator delete(void*) (vg_replace_malloc.c:387)
==4506==    by 0x400CD2: MyQueue::dequeue() (MyQueue.h:37)
==4506==    by 0x400DD7: main (p1.cpp:24)
==4506== 
==4506== 
==4506== HEAP SUMMARY:
==4506==     in use at exit: 0 bytes in 0 blocks
==4506==   total heap usage: 1 allocs, 2 frees, 120 bytes allocated
==4506== 
==4506== All heap blocks were freed -- no leaks are possible
==4506== 
==4506== For counts of detected and suppressed errors, rerun with: -v
==4506== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)

seems like something stupid but I can't figure it out for the life of me, thanks for the help

解决方案

The problem might be due to the fact that in the constructor you're dynamically allocating an array:

queue = new tile[cap]; 

but in deque you delete it using the non-array delete operator.

tile* victim = queue;
queue++;
delete victim;  

It just looks like the logic in the code is mismatched. On one hand there is code that allocates dynamic arrays but then in other places it deletes individual elements of that dynamically allocated array.

这篇关于*** glibc detected *** free():invalid pointer:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆