LibAIFF CloseFile:释放的指针未被随机分配

我编写了一段代码,试图在目录及其子文件夹中搜索两个AIFF文件,并使用LibAIFF库导入然后对它们执行一些处理操作。

第1部分:在目录中搜索文件

对于程序的这一部分,我需要查找具有已知名称的文件(可以将其视为相同的AIFF文件,但文件名不同)(例如SineSweepA.aiff和SineSweepB.aiff)然后构建它的绝对路径(我不知道的长度(因为我的程序需要在不同的计算机上工作,其中AIFF可以位于MainDirectory中的不同子文件夹中 – 请参阅下面的代码)但知道长度少于200个字符)。 我能够使用以下代码成功并始终如一地执行此操作:

 void file_search(char* parentDir, char* subFolder, char* filenamePrefix, char* tempString, char* tempFilepath, int* foundFlag, int* level); int32_t *import_sweeps(char* sweepFilepath, uint64_t* numSamples, int* numChannels, double* samplingRate, int* bitDepth, int* segmentSize, int* importFlag); int main() { ... char MainDirectory[200] = "/Users/rrr/Documents/Foldername1/"; char tempFilepath[200], tempFilepathR[200], parentDir[200], filenamePrefix[200], subFolder[200], tempString[200]; int level = 0, foundFlag = 0; int numChannels = 0; int bitDepth; int segmentSize; int importFlag = 0; int32_t *sweepRfile = NULL; uint64_t numSamples = 0, numSamplesR = 0; unsigned long templen; double samplingRate = 0.0; char *sweepFilepath = NULL, *sweepFilepathR = NULL; // Allocated to specific size later strcpy(parentDir, MainDirectory); strcat(parentDir, "SubFolderName1/"); strcpy(tempFilepathR, parentDir); strcpy(filenamePrefix, "KnownFilenamePrefix1"); // file_search() searches for a specific file with a known name and constructs the absolute path to the file and stores it in tempFilepathR. The function is shown further below. file_search(parentDir, subFolder, filenamePrefix, tempString, tempFilepath, &foundFlag, &level); if (foundFlag) { sprintf(tempFilepath, "%s%s/KnownFilenamePrefix1%s.aiff", parentDir, subFolder, subFolder); sprintf(tempFilepathR, "%s%s/KnownFilenamePrefix2%s.aiff", parentDir, subFolder, subFolder); } ... (to be continued in Part 2 of my question below) } void file_search(char* dir, char* subfolder, char* fileprefix, char* filename, char* filepath, int*flag, int* level) { DIR *dp; struct dirent *entry; // entry is a pointer to the structure "dirent" defined in  struct stat statbuf; // the structure "stat" is defined in  if((dp = opendir(dir)) == NULL) { fprintf(stderr,"Cannot open directory: %s\n", dir); return; } chdir(dir); // this sets the working directory to the string pointed to by "dir" while((entry = readdir(dp)) != NULL) { lstat(entry->d_name, &statbuf); if(S_ISDIR(statbuf.st_mode)) // Tests for a directory { // Found a directory if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0) { // Ignore . and .. continue; } if(level[0] d_name); level[0] = level[0] + 1; // Recursive function call file_search(entry->d_name, subfolder, fileprefix, filename, filepath, postfilepath, flag, level); level[0] = level[0] - 1; if(flag[0] == 1) { // Exit loop if a file was found at a lower level break; } } } else { sprintf(filename, "%s%s.aiff", fileprefix, subfolder); if(strcmp(entry->d_name,filename) == 0) { // File found. Construct absolute path to file sprintf(filepath, "%s%s/%s", filepath, subfolder, filename); // Pass filepath outside flag[0] = 1; //Appropriate file found break; } } } chdir(".."); closedir(dp); } 

因此,通过使用上面的代码,我能够通过使用已知的MainDirectory搜索子文件夹,成功搜索具有给定文件名的两个AIFF文件,构造它们的绝对路径并将它们存储在tempFilepathtempFilepathR 。 下一步是导入这两个文件,这是我遇到问题的地方。

第2部分:导入文件

我遇到的问题如下:我实现了LibAIFF库来导入文件。 问题是,如果我运行程序,说N次,那么在某些运行中,第一个文件被导入而不是第二个,在其他运行中第二个文件被导入而不是第一个(注意如果第一个没有) t导入,程序停止)。 在我解释错误之前 ,请知道AIFF文件没有问题,为了这个问题你可以假设它们是相同的,甚至它们的绝对路径和文件名是相同的,除了一个有后缀A.aiff和其他B.aiff 。 这些文件路径作为字符串存储在相同定义的变量( tempFilepathtempFilepathR )中。

以下是我的代码的其余部分从上面继续

 int main() { // Continued from above ... // Copy over exact file paths (I had to do this because the function AIFF_OpenFile which is part of the LibAIFF library and shown below refused to accept a statically allocated char variable such as tempFilepath) templen = strlen(tempFilepathR); // tempFilepath and tempFilepathR always have the same length sweepFilepath = malloc(templen + 1); strcpy(sweepFilepath, tempFilepath); // Proceed to import the FIRST AIFF (returned to sweepRfile from import_sweeps()) sweepRfile = import_sweeps(sweepFilepath, &numSamples, &numChannels, &samplingRate, &bitDepth, &segmentSize, &importFlag); if (importFlag) // The import was successful { free(sweepFilepath); // Do some processing with the successfully imported AIFF free(sweepRfile); } else // The import was unsuccessful and sweepRfile (which is usually malloc'ed in the import_sweeps() function is not malloc'ed { free(sweepFilepath); } // Now for the SECOND AIFF (I can overwrite a lot of the variables used for the first AIFF because I don't need them) sweepFilepathR = malloc(templen + 1); // templen is assigned above strcpy(sweepFilepathR, tempFilepathR); // Proceed to import the SECOND AIFF (returned to sweepRfile from import_sweeps()) sweepRfile = import_sweeps(sweepFilepathR, &numSamplesR, &numChannels, &samplingRate, &bitDepth, &segmentSize, &importFlag); if (importFlag) // The import was successful { free(sweepFilepathR); // Do some processing with the successfully imported AIFF free(sweepRfile); } else // The import was unsuccessful and sweepRfile (which is usually malloc'ed in the import_sweeps() function is not malloc'ed { free(sweepFilepathR); } ... // Rest of code in main is irrelevant because it doesn't even get there. } 

中断始终发生在import_sweeps()函数中(有时是第一个AIFF,有时是第二个)。 function如下所示

 int32_t *import_sweeps(char* sweepFilepath, uint64_t* numSamples, int* numChannels, double* samplingRate, int* bitDepth, int* segmentSize, int* importFlag) { // Initialize files for importing */ AIFF_Ref fileref; // Import Routine */ fileref = AIFF_OpenFile(sweepFilepath, F_RDONLY); if(fileref) { // File opened successfully. Proceed to intialize files for getting information about AIFF file uint64_t nSamples; int nSamplePts, channels, bitsPerSample, segSize, temp; double smpr; // Get AIFF file format details temp = AIFF_GetAudioFormat(fileref, &nSamples, &channels, &smpr, &bitsPerSample, &segSize); if (temp < 1) { fprintf(stderr,"Error getting audio format.\n"); AIFF_CloseFile(fileref); return (int32_t) 0; } else { numSamples[0] = nSamples; samplingRate[0] = smpr; numChannels[0] = channels; bitDepth[0] = bitsPerSample; segmentSize[0] = segSize; nSamplePts = ((int) nSamples)*channels; int32_t *samples = malloc((nSamplePts+1) * sizeof(int32_t)); // Read AIFF temp = AIFF_ReadSamples32Bit(fileref, samples, nSamplePts); if (temp != -1) { AIFF_CloseFile(fileref); importFlag[0] = 1; return samples; } else { fprintf(stderr,"Unable to read AIFF.\n"); AIFF_CloseFile(fileref); return (int32_t) 0; } } } else { fprintf(stderr,"Unable to open AIFF file.\n"); } return (int32_t) 0; } 

在上面的import_sweeps()中,通过调用函数AIFF_ReadSamples32Bit(fileref, samples, nSamplePts);总是成功读取AIFF文件AIFF_ReadSamples32Bit(fileref, samples, nSamplePts); 。 因此,临时值永远不会为-1。 每当发生错误(如上所述,我将在下面给出实际的错误消息)时,它总是在尝试调用AIFF_CloseFile(fileref);

下面显示的是LibaIFF库中定义的函数AIFF_ReadSamples32BitAIFF_CloseFile

 int AIFF_ReadSamples32Bit(AIFF_Ref r, int32_t * samples, int nSamplePoints) { int n = nSamplePoints; void *buffer; int i, j; size_t h; size_t len; int segmentSize; int32_t *dwords; int16_t *words; int8_t *sbytes; uint8_t *inbytes; uint8_t *outbytes; uint8_t x, y, z; if (!r || !(r->flags & F_RDONLY)) return -1; if (n % (r->nChannels) != 0) return 0; if (n segmentSize == 0) { if (r->buffer) { free(r->buffer); r->buffer = NULL; r->buflen = 0; } return -1; } segmentSize = r->segmentSize; len = (size_t) n * segmentSize; if ((r->buflen) buffer) free(r->buffer); r->buffer = malloc(len); if (!(r->buffer)) { return -1; } r->buflen = len; } buffer = r->buffer; h = AIFF_ReadSamples(r, buffer, len); if (h buffer); r->buffer = NULL; r->buflen = 0; return 0; } n = (int) h; if (n % segmentSize != 0) { free(r->buffer); r->buffer = NULL; r->buflen = 0; return -1; } n /= segmentSize; switch (segmentSize) { case 4: dwords = (int32_t *) buffer; for (i = 0; i < n; ++i) samples[i] = dwords[i]; break; case 3: inbytes = (uint8_t *) buffer; outbytes = (uint8_t *) samples; n <<= 2; /* n *= 4 */ j = 0; for (i = 0; i >= 2; break; case 2: words = (int16_t *) buffer; for (i = 0; i < n; ++i) { samples[i] = (int32_t) (words[i]) << 16; } break; case 1: sbytes = (int8_t *) buffer; for (i = 0; i < n; ++i) { samples[i] = (int32_t) (sbytes[i]) << 24; } break; } return n; } 

 int AIFF_CloseFile(AIFF_Ref ref) { int r; if (!ref) return -1; if (ref->flags & F_RDONLY) { AIFF_ReadClose(ref); // BREAK OCCURS HERE EVERYTIME r = 1; } else if (ref->flags & F_WRONLY) { r = AIFF_WriteClose(ref); } else { r = -1; } return r; } 

中断发生在AIFF_ReadClose(ref); 每次。 所以我也在下面展示了这个function。

 static void AIFF_ReadClose(AIFF_Ref r) { if (r->buffer) free(r->buffer); if (r->buffer2) free(r->buffer2); // THIS IS WHERE THE BREAK OCCURS EVERYTIME Unprepare(r); fclose(r->fd); free(r); return; } 

中断始终如上所示。 以下是错误消息 :(25693,0x7fff7db87310)malloc: *对象0x4000000000000000的错误:未释放指针*在malloc_error_break中设置断点以进行调试

所以基本上,上述错误不可预测地发生。 当它没有发生时,我的代码完美无缺。 关于如何解决这个问题的任何帮助非常感谢。

如果任何人愿意下载LIBAIFF图书馆以进一步调查并帮助我,那么图书馆的链接是: http ://aifftools.sourceforge.net/libaiff/。

在此先感谢您的任何建议!

1,请确认buffer2在使用前已经用NULL初始化。 在所有粘贴的代码中,我找不到buffer2任何赋值或内存分配。

2,请在调用free后将指针指定为NULL,如:

 if (r->buffer) { free(r->buffer); r->buffer = NULL; } if (r->buffer2) { free(r->buffer2); r->buffer2 = NULL; } 

如果这一切都无法解决您的问题,请提供更多有关buffer2代码。