以下代码显示我获取某个文件的文件大小,然后在以后创建足够大的缓冲区,以确保可以将所有文件内容存储在此缓冲区中。所以我所做的就是在堆上分配它,因为我不知道文件是否很大等等。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
size_t filesize(FILE* f) {
size_t size;
fseek(f, 0L, SEEK_END);
size = ftell(f);
fseek(f, 0L, SEEK_SET);
return size;
}
char* read_file(std::string name) {
FILE* f;
fopen_s(&f, name.c_str(), "rb");
size_t size = filesize(f);
char* buffer = new char[size+1];
memset(buffer, 0, size+1);
fread(buffer, sizeof(char), size+1, f);
fclose(f);
return buffer; //this is the buffer with the content to send
}
int main() {
char* buffer = read_file("main.cpp");
printf("%s", buffer);
delete[] buffer;
buffer = nullptr;
getchar();
return 0;
}
我的问题是,我是否已成功删除
char* buffer = new char[size+1];
通过执行以下操作从堆中:
char* buffer = read_file("main.cpp");
delete[] buffer;
buffer = nullptr;
还是仍然保留在某个地方? 如果确实如此,我该如何查明并删除它?
任何有关如何处理原始指针的技巧也将受到赞赏。
答案 0 :(得分:2)
是的,您的代码正确删除了缓冲区。
C ++有多种方法可以为您处理此问题,因此您不必担心它,并且出错的可能性较小,而忘记在某些或所有代码路径中释放缓冲区,例如容易犯这样的错误:
char aCharacter = 'A';
一种选择是使用int main()
{
char* buffer = read_file("main.cpp");
if ( buffer[0] != 'A' )
{
std::cout << "data is invalid\n";
return 1; // oops forgot to free buffer
}
delete[] buffer;
// data is valid
return 0;
}
,它会在超出范围时为您释放缓冲区:
std::unique_ptr