考虑以下从文件中读取一些字节的抽象代码:
typedef struct A{
int size;
char * dataArray;
}A
A load(char* filename, int inSize)
{
A newA;
newA.size = inSize;
FILE *filePtr;
filePtr = fopen(filename,"rb");
char buff[1];
int i = 0;
newA.dataArray = ( char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
newA.dataArray[i] = buff[0];
}
char* copyOfDataArray = (char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < newA.size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
copyOfDataArray[i] = newA.dataArray[i];
}
newA.dataArray = copyOfDataArray;
return newA
}
void Initialize()
{
A first = load("file1", 100);
A second = load("file2", 20);
}
对函数加载的两个调用都返回预期结果(数据数组的字节数与文件的字节数相同)。第一个和第二个变量将不再使用。
然而,在几百行代码之后,程序总是崩溃:
*malloc.c:2451: sYSMALLOC: Assertion '(old_top == (..... failed.*
崩溃总是发生在同一行代码上,但这一行与第一、第二个变量无关,甚至与结构A无关。
我的问题是:我实例化和加载"first"one_answers"second"的方式错了吗?它是否会导致某种内存泄漏/内存溢出,从而在加载函数完成后很长一段时间内使程序崩溃?
奖励:如果我只加载"file1",则不会发生崩溃,只要我同时加载"file2"one_answers"file1",崩溃就会再次出现。
很抱歉问题太长。
那里存在内存泄漏。在分配新内存之前,您必须释放newA.dataArray中先前分配的内存。
正如Joachim所说,读取操作非常耗时,您应该分块读取数据以最大限度地减少开销。
此外,您必须关闭文件描述符,否则它们将很快耗尽。
其他人已经给出了许多关于代码的问题。请检查以下
typedef struct A{
int size;
char * dataArray;
}A
A load(char* filename, int inSize)
{
A newA;
newA.size = inSize;
FILE *filePtr = NULL ; //Use NULL
char buff[1]; //Size of buffer is only 1 ,If needed increase that to copy more at a time
int i = 0;
filePtr = fopen(filename,"rb");
//Try to check for the filePtr == NULL or not
newA.dataArray = ( char*)malloc(sizeof(char) * newA.size);
//Same checking should be done here
for (i = 0; i < size; i++) //What is size
{
fread(buff, sizeof(char), 1, filePtr);
newA.dataArray[i] = char[0]; //What is char[0]
}
//instead this you can read the bytes in a single call, use that.
// fread(buff, sizeof(char), <size to read >, filePtr);
char* copyOfDataArray = (char*)malloc(sizeof(char) * newA.size);
for (i = 0; i < size; i++)
{
fread(buff, sizeof(char), 1, filePtr);
copyOfDataArray[i] = newA.dataArray[i];
}
//why reading again once you done above.
newA.dataArray = copyOfDataArray;
return newA; //Please check: How you can return a auto variable.
}
void Initialize()
{
A first = load("file1", 100);
A second = load("file2", 20);
}