- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一段代码,尝试在目录及其子文件夹中搜索两个 AIFF 文件,并使用 LibAIFF 库导入它们,然后对它们执行一些处理操作。
第 1 部分:在目录中搜索文件
对于程序的这一部分,我需要查找具有已知名称(例如 SineSweepA.aiff 和 SineSweepB.aiff)的文件(可以将其视为相同的 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 <dirent.h>
struct stat statbuf; // the structure "stat" is defined in <stat.h>
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] < 1)
{
// Proceed down one level and search again
strcpy(subfolder,entry->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 文件,构建它们的绝对路径并将它们存储在 中tempFilepath
和 tempFilepathR
。下一步是导入这两个文件,这就是我遇到问题的地方。
第 2 部分:导入文件
我遇到的问题如下:我实现了 LibAIFF 库来导入文件。问题是,如果我运行程序,比如说 N 次,那么在某些运行中,第一个文件会被导入,但第二个文件不会被导入,在其他运行中,第二个文件会被导入,但不会第一个(请注意,如果第一个文件没有导入)如果没有导入,程序就会停止)。 在我解释错误之前,请知道 AIFF 文件没有问题,为了解决这个问题,您可以假设它们是相同的,甚至它们的绝对路径和文件名也是相同的,除了一个有一个后缀 A.aiff
和另一个 B.aiff
。这些文件路径以字符串形式存储在相同定义的变量中(tempFilepath
和 tempFilepathR
)。
这是我的代码的其余必要部分,继续上面
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,有时针对第二个)。函数如下图
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 文件。因此,临时值永远不会是-1。每当发生错误(如上所述,我将在下面给出实际的错误消息)时,它总是在尝试调用 AIFF_CloseFile(fileref);
时发生。
下面显示的是 LibAIFF 库中定义的函数 AIFF_ReadSamples32Bit
和 AIFF_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 < 1 || r->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) < len) {
if (r->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 < (size_t) segmentSize) {
free(r->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 < n; i += 4) {
x = inbytes[j++];
y = inbytes[j++];
z = inbytes[j++];
#ifdef WORDS_BIGENDIAN
outbytes[i] = x;
outbytes[i + 1] = y;
outbytes[i + 2] = z;
outbytes[i + 3] = 0;
#else
outbytes[i] = 0;
outbytes[i + 1] = x;
outbytes[i + 2] = y;
outbytes[i + 3] = z;
#endif
}
n >>= 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);
处。所以我也在下面展示了这个函数。
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: * error for object 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
的代码。
关于c - LibAIFF 关闭文件 : Pointer being freed was not allocated occurs randomly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22451558/
我正在使用套接字并将一些数据写入服务器。第一次连接到服务器时一切正常。但是当它第二次写入,有时是第三次写入时,它会因错误而崩溃: "malloc: *** error for object 0x7c1
给定代码: class Sample { public: int *ptr; Sample(int i) { ptr = new int(i);
#include #include #include #include #include using namespace std; class CFile { public: CFi
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在尝试在线找到的四叉树实现,但作为以下(精简的)_node_release 函数的一部分,间歇性地收到“正在释放的指针未分配”错误: static void _node_release(node*
我正在尝试在线找到的四叉树实现,但作为以下(精简的)_node_release 函数的一部分,间歇性地收到“正在释放的指针未分配”错误: static void _node_release(node*
我正在尝试运行一个删除链表第 n 个元素的函数(使用从零开始的索引)。即使我不必 malloc 任何东西,我也会收到此错误:“ev(10676,0x7fff73f9d300) malloc: * er
我正在从标准输入读取内容。由于我不知道要读的内容的长度,所以我必须使用 malloc。 我得到一个被释放的指针未分配 有时,它发生在 free(final) 之前,有时发生在 free(tmp) 之前
我得到一个错误 malloc: *** error for object 0x146f9404: incorrect checksum for freed object - object was
我正在使用 C++ 进行线程处理并进行了一些测试并遇到了这个错误。 这是我的代码: #include #include #include #include #include using na
我有以下功能: void stringcopy(char * to, char const * const from) { int size = 1; while (from[size
每次我想将元素添加到存储类中的 std::map 时,我都会收到错误消息“未分配正在释放的指针”。我在构造函数和析构函数中添加了一些“couts”来调试,输出是: 新的德尔删除 所以看起来析构函数被调
我定义了一个包含字节数组及其长度的结构。析构函数应该只删除字节数组,如果它是由结构的构造函数动态实例化的话。但有时,delete array; 指令失败并出现错误 pointer being free
我正在构建一个 AVL 树。我有一种方法可以删除树中的项目,但出现错误。 这是我得到的运行时错误: malloc: *** error for object 0x100100120: pointer
这是我的功能: void Tetris::place_square(int* coords,char type){ if (coords[1]>heights[coords[0]]){
我创建了一个双链表类,并试图将它与我创建的 Vector 类一起使用,以便制作一个链表 vector ,但是在程序结束时,我似乎遇到了一个错误malloc:对象 0x100100be0 的 *** 错
我想我的 C 现在有点生疏了,因为我不太明白这里的问题。我很确定它位于 parse_historical_data() 中。如果我将其注释掉并运行 allocate_historical_data()
我正在使用 C 语言研究 Segdwick 的算法,并尝试动态链表数组。我在 main 的 return 0 处遇到段错误。我的重点是正确加载和打印链接列表,完成后我没有释放列表数组。 所以我添加了
我正在努力寻找无法释放内存块的原因。指针一定有问题。结构的内存块在函数中创建,使用的指针存储在数组中。稍后从数组中获取指针以用于释放内存。 我已经弄清楚它是免费的了。我在它旁边放了“//这个”。 #i
我正在尝试重载赋值运算符以执行多边形对象的深拷贝,程序编译但我在接近尾声时收到错误,我想清除。以下是相关代码,如果您认为我需要添加更多内容,请发表评论。假设适当的 #include的那 class P
我是一名优秀的程序员,十分优秀!