我是否已成功从堆中删除了指针?

时间:2018-11-03 14:02:26

标签: c++ file

以下代码显示我获取某个文件的文件大小,然后在以后创建足够大的缓冲区,以确保可以将所有文件内容存储在此缓冲区中。所以我所做的就是在堆上分配它,因为我不知道文件是否很大等等。

#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;

还是仍然保留在某个地方? 如果确实如此,我该如何查明并删除它?

任何有关如何处理原始指针的技巧也将受到赞赏。

1 个答案:

答案 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