所以我几天来一直困在记忆问题上。 我有一个用c ++运行的多线程程序。我初始化一个双*指针。 根据我的阅读和以前的编程经验,指针被初始化为垃圾。如果将其初始化为0或者为程序分配的内存太多,它将为Null。对我来说,我的指针初始化,没有分配,给了我一个空指针。 我编写的解析器函数假设返回一个指向解析信息数组的指针。当我调用该函数时,
double* data;
data = Parser.ReadCoordinates(&storageFilename[0]);
现在返回指向数组的指针应该设置为data。然后我尝试从阵列中打印出一些东西。我得到了内存损坏错误。我运行了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 ***
有人可以向我解释发生了什么事吗?我已经尝试将指针初始化为全局,但这也不起作用。我试图分配内存但我仍然遇到内存损坏错误。解析器工作。我用一个简单的程序测试了它。所以我不明白为什么它在我的其他程序中不起作用。我究竟做错了什么?如果需要,我还可以提供更多信息。
解析器代码
double * csvParser :: ReadCoordinates(char * filename){
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;
}
答案 0 :(得分:0)
当您在数组或向量的边界外写字时,会发生损坏的内存 它被称为heap underrun and overrun(取决于它在哪一侧)。
堆的分配数据已损坏,因此您看到的症状是free()或new()调用中的异常。
您通常不会获得访问冲突,因为内存已分配且属于您,但它由堆的逻辑使用。
找到你可能在数组边界外写字的地方。