0

所以我已经被困在记忆问题上好几天了。我有一个使用 c++ 运行的多线程程序。我初始化了一个 double* 指针。根据我的阅读和以前的编程经验,指针被初始化为垃圾。如果将其初始化为 0 或分配的内存对程序来说太多,它将为 Null。对我来说,我的指针初始化,没有分配,给了我一个空指针。我编写的解析器函数假设返回指向已解析信息数组的指针。当我调用该函数时,

double* data;
data = Parser.ReadCoordinates(&storageFilename[0]);

现在返回的指向数组的指针应该设置为数据。然后我尝试从数组中打印出一些东西。我收到内存损坏错误。我已经运行了 gdb,它给了我一个内存损坏错误:

*** glibc detected *** /home/user/kinect/openni/Platform/Linux/Bin/x64-Debug/Sample-NiHandTracker: free(): corrupted unsorted chunks: 0x0000000001387f90 ***
*** glibc detected *** /home/user/kinect/openni/Platform/Linux/Bin/x64-Debug/Sample-NiHandTracker: malloc(): memory corruption: 0x0000000001392670 ***

有人可以向我解释发生了什么吗?我尝试将指针初始化为全局指针,但这也不起作用。我尝试分配内存,但仍然出现内存损坏错误。解析器工作。我已经用一个简单的程序对其进行了测试。所以我不明白为什么它在我的其他程序中不起作用。我究竟做错了什么?如果需要,我还可以提供更多信息。

解析器代码

双* csvParser::ReadCoordinates(char* 文件名){

int x;              //counter
int size=0;         //
char* data;
int i = 0;          //counter

FILE *fp=fopen(filename, "r");


if (fp == NULL){
 perror ("Error opening file");
}

while  (( x = fgetc(fp)) != EOF ) {  //Returns the character currently pointed by the internal file position indicator
    size++;     //Number of characters in the csv file
}

rewind(fp);                         //Sets the position indicator to the beginning of the file
printf("size is %d.\n", size);      //print

data = new char[23];                //Each line is 23 bytes (characters) long
size = (size/23) * 2;               //number of x, y coordinates


coord = new double[size];           //allocate memory for an array of coordinates, need to be freed somewhere

num_coord = size;                   //num_coord is public

//fgets (data, size, fp);
//printf("data is %c.\n", *data);

for(x=0; x<size; x++){
    fgets (data, size, fp);
    coord[i] = atof(&data[0]);          //convert string to double
    coord[i+1] = atof(&data[11]);       //convert string to double
    i = i+2;
}


delete[] data;

fclose (fp);

return coord;

}

4

1 回答 1

0

当您在数组或向量的范围之外写入时,会发生损坏的内存。
它被称为堆欠载和溢出(取决于它在哪一侧)。

堆的分配数据已损坏,因此您看到的症状是 free() 或 new() 调用中的异常。
您通常不会遇到访问冲突,因为内存已分配并且属于您,但它被堆的逻辑使用。

找到您可能在数组边界之外写入的位置。

于 2013-03-02T21:51:35.057 回答