gpt4 book ai didi

c++ - 内存泄漏/管理建议(方法中的新数组)(c++)

转载 作者:太空宇宙 更新时间:2023-11-04 13:29:56 25 4
gpt4 key购买 nike

我正在关注 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();

所以我想“我为什么要使用字符串?我必须包含它,然后我必须将所有内容复制到字符串中,以便我可以再次将它复制到一个 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),但从一项小型研究来看(我承认,没有我身边的任何测试)这种方式通常更快

最佳答案

动态内存分配,由 C++ 中的程序员管理。然后,问题是,除非您事先知道文件的大小,并在方法外部分配一个缓冲区,然后传递它,否则您不能这样做。像这样的东西:

dosomething(file, file_size) {
char a[file_size]; //a is a pointer.
read_file(file, a);
}

然后在read_file中:

/* Where a is char * parameter */
memset(a, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(a, 1, length, file);

通过这样做,您不必手动释放 char 内容的内存,因为它是堆栈内存,并且它会在退出作用域时自动释放。

再一次,这种方法需要您事先知道文件大小。

关于c++ - 内存泄漏/管理建议(方法中的新数组)(c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com