内存管理 C
Memory Managing C
我写了一个函数,使用 C 标头stdio.h
返回文件内容(文本或 html)。任何人都可以浏览一下并建议我是否有效地完成了内存管理。我很高兴听到更好的建议,我可以改进我的代码。
char *getFileContent(const char *filePath)
{
//Prepare read file
FILE *pReadFile;
long bufferReadSize;
char *bufferReadFileHtml;
size_t readFileSize;
char readFilePath[50];
sprintf_s(readFilePath, "%s", filePath);
pReadFile = fopen (readFilePath, "rb");
if (pReadFile != NULL)
{
// Get file size.
fseek (pReadFile , 0 , SEEK_END);
bufferReadSize = ftell (pReadFile);
rewind (pReadFile);
// Allocate RAM to contain the whole file:
bufferReadFileHtml = (char*) malloc (sizeof(char) * bufferReadSize);
if (bufferReadFileHtml != NULL)
{
// Copy the file into the buffer:
readFileSize = fread (bufferReadFileHtml, sizeof(char), bufferReadSize, pReadFile);
if (readFileSize == bufferReadSize)
{
return bufferReadFileHtml;
} else {
char errorBuffer[50];
sprintf_s(errorBuffer, "Error! Buffer overflow for file: %s", readFilePath);
}
} else {
char errorBuffer[50];
sprintf_s(errorBuffer, "Error! Insufficient RAM for file: %s", readFilePath);
}
fclose (pReadFile);
free (bufferReadFileHtml);
} else {
char errorBuffer[50];
sprintf_s(errorBuffer, "Error! Unable to open file: %s", readFilePath);
}
}
这
看起来像一个C程序,而不是一个C++程序。虽然它将使用大多数C++编译器进行编译,但它没有利用任何C++功能(例如new/new[],delete/delete[],显式强制转换,流运算符,字符串,nullptr等)。
你的代码几乎看起来像一个安全的C函数,尽管我认为sprintf_s
是一个仅限Microsoft函数,因此可能不会使用GCC,Clang,Intel等进行编译,因为它不是标准的一部分。
您的函数还应始终返回一个值。打开编译器警告以捕获此类内容;它们使调试变得更加容易:)
不知道您将
如何使用您创建的缓冲区,就没有什么可说的了。 以下是一些可能的注意事项:
1) 当您将文件读入缓冲区时,您的处理器不会对此程序执行任何其他操作。 最好并行读取并开始分析已读取的部分。
2)如果你需要真正快速高效的低内存文件IO,请考虑将你的程序转换为状态机,完全忘记缓冲区。
3)如果你真的没有一个非常苛刻的应用程序,你用C写是自杀的。 C#,python等 - 几乎任何其他语言都有更好的字符串操作库。
顺便说一句,正如其他人指出的那样,您应该使用 snprintf 来实现便携性和安全性。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 可以通过非原始指针来增强容器矢量管理内存
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 线程管理内存泄漏
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 管理内存C++
- ptr_vector如何管理内存
- 在C++Builder/Firemonkey中使用表单创建来管理内存
- 如何正确管理内存(运行时)C++
- 在Node.js中使用Native Abstractions时,如何管理内存
- ostream是如何管理内存的
- C++中管理内存泄漏的问题
- OpenCL:在 CPU 上而不是在 GPU 上更正结果:如何正确管理内存
- deque是如何管理内存的
- 用c++/cli互操作管理内存
- 如何衡量管理内存所花费的时间
- (加速C++)章节管理内存
- 如何在此场景中管理内存