【发布时间】:2015-11-01 20:10:51
【问题描述】:
我正在关注 youtube 上的教程,并尝试在文件输入法中稍微更改代码:
static std::string read_file(const char* filepath){
FILE* file = fopen(filepath, "rt"); //read text file
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
delete[] data;
return result;
}
这是原始代码,将在此上下文中使用:
std::string vertSourceString = read_file(m_VertPath);
const char *source = vertSourceString.c_str();
所以我想“我为什么要使用 String?我必须包含它,然后我必须将所有内容复制到字符串,以便我可以再次将其复制到 char*?所以我尝试了这个:
static char* read_file(const char* filepath){
FILE* file = fopen(filepath, "rt"); //read text file
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char* data = new char[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
return data;
}
但是如果我不删除它,它有一个非常明显的内存泄漏:
char *c = read_file("src/shaders/basic.vert");
delete c;
那么,有没有办法在方法中删除它,仍然返回它的副本? 需要删除的方法似乎不是很好的做法。 我应该回到以前的实现吗?
PS:我知道 C++ 有一种“更简单”的读取文件的方式 (fstream),但根据一项小型研究(我承认,没有任何测试在我身边)这种方式通常更快
【问题讨论】:
-
如果你的想法是“我为什么要使用
char *?我应该在任何地方都使用string。” -
抱歉,应该说明我正在将它与 OpenGL 一起使用来读取着色器并用于:“void glShaderSource(GLuint shader, GLsizei count, const GLchar **string, const GLint *length); "所以我想我迟早会需要 char *
标签: c++ memory-management memory-leaks