堆免费腐败()

时间:2015-05-18 10:44:32

标签: c

调用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();

1 个答案:

答案 0 :(得分:3)

  1. 您正在释放非堆变量,您不应该删除此

    free(&circQ[front]);
    
  2. 您为img成员分配空间,只需一个字节,空字符串需要一个字节用于终止'\0',然后您执行strcpy()这意味着字符串,即非nul字节序列后跟nul字节。

    也许你的意思是

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

    也与

    相同
    circQ[rear].img[0] = img[0];
    
  3. 您应该检查malloc()

  4. 的返回值
  5. 您不需要转换malloc()的返回值,如果需要,则使用错误的编译器或错误的编程语言。