调用free()函数时,我一直收到堆损坏错误。该项目在VC ++ 2010中工作。整个构建过程都正常,但是在运行时出现错误:(CircularQueue是我的项目的名称)


  错误:
  
  Windows已在CircularQueue.exe中触发了一个断点。
  
  这可能是由于堆损坏所致,这表明存在错误
  CircularQueue.exe或它已加载的任何DLL。
  
  这也可能是由于用户在CircularQueue.exe中按下了F12
  有重点。
  
  输出窗口可能包含更多诊断信息。


#include "stdafx.h"
#include<stdio.h>
#include <string.h>
#include <Windows.h>


#include "CircularQ.h"

#define max 4
//char circQ[10][3145728];

Image_details_t circQ[max],*ptr[max];
Image_details_t *temp;
LONG q[10],front=0,rear=-1;
#if 1
void main()
{

    int ch;
    //void insert();
    insert("h",1,1,1,1);
    insert("h",1,1,1,1);
    insert("h",1,1,1,1);
    delet();
    delet();
    delet();
    delet();
    while(1);
}

#endif

void insert(char *img,int channel,int imgWidth,int imgHeight,int imgLen)
{
    //int x;
    //char x[20];
    int l = 0;

    if((front==0&&rear==max-1)||(front>0&&rear==front-1))
        printf("Queue is overflow\n");
    else
    {
        l = strlen(img);
        //scanf("%d",&x);
        if(rear==max-1&&front>0)
        {
            printf("hello i m here");
            InterlockedCompareExchange( &rear,0,rear);
            circQ[rear].img = (char *) malloc(1);
            strcpy(circQ[rear].img,img);
            circQ[rear].channel = channel;
            circQ[rear].imgWidth = imgWidth;
            circQ[rear].imgHeight = imgHeight;
            circQ[rear].imgLen = imgLen;

            //q[rear]=x;
        }
        else
        {
            if((front==0&&rear==-1)||(rear!=front-1))
            {
                InterlockedExchangeAdd(&rear,1);
                circQ[rear].img = (char *)malloc(l);
                strcpy(circQ[rear].img,img);
                circQ[rear].channel = channel;
                circQ[rear].imgWidth = imgWidth;
                circQ[rear].imgHeight = imgHeight;
                circQ[rear].imgLen = imgLen;
                //q[rear]=x;
            }
        }
    }
}
void  delet()
{
    char a[20];
    //  char *temp;

    if((front==0)&&(rear==-1))
    {
        printf("Queue is underflow\n");
        return;
        //exit(0);
    }
    if(front==rear)
    {
        //a=q[front];
        strcpy(a,circQ[front].img);
        //temp = circQ[front];
        //free(temp);
        //free(circQ[rear].img);
        InterlockedCompareExchange( &rear,-1,rear);
        InterlockedCompareExchange( &front,0,front);
    }
    else
        if(front==max-1)
        {
            //a=q[front];
            strcpy(a,circQ[front].img);
            //free(circQ[rear].img);
            //temp = circQ[front];
            //free(temp);
            InterlockedCompareExchange( &front,0,front);
        }
        else
            {

                strcpy(a,circQ[front].img);
                //free(circQ[rear].img);
                temp = &circQ[front];
                free(temp);              // in this part problem is occurring
                InterlockedExchangeAdd(&front,1);
                //a=q[front];
            }
        printf("Deleted element is:%s\n",a);
        free(&circQ[front]);


}


头文件:

#include <stdio.h>
#include <malloc.h>
#include <stdint.h>

typedef struct Image_details
{
    char *img;
    int channel;
    int imgWidth;
    int imgHeight;
    int imgLen;
}Image_details_t;

void insert(char *img,int channel,int imgWidth,int imgHeight,int imgLen);
void  delet();

最佳答案

您要释放非堆变量,不应该删除此变量

free(&circQ[front]);

您为img成员分配空间,只有一个字节,一个空字符串需要一个字节作为终止'\0',然后执行strcpy(),这是针对字符串的,即非nul字节序列后跟一个nul,字节。

也许你是说

memcpy(circQ[rear].img, img, 1);


这也和

circQ[rear].img[0] = img[0];

您应该检查malloc()的返回值。
您不需要强制转换malloc()的返回值,如果需要,则使用的是错误的编译器或错误的编程语言。

关于c - 免费时堆腐败(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30301122/

10-11 18:24