Я успешно удалил указатель из кучи? - PullRequest
0 голосов
/ 03 ноября 2018

Следующий код показывает, как я получаю размер файла определенного файла, чтобы потом создать достаточно большой буфер, чтобы я мог хранить все содержимое файла в этом буфере. Поэтому я выделил его в кучу, потому что я не мог знать, большой ли файл или нет и т. Д.

#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 голосов
/ 03 ноября 2018

Да, ваш код правильно удаляет буфер.

C ++ имеет различные способы справиться с этим за вас, поэтому вам не нужно об этом беспокоиться, и вы с меньшей вероятностью допустите ошибки и забудете освободить буфер в некоторых или во всех путях кода, например. легко ошибиться, как это:

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, который освободит буфер для вас, когда он выйдет из области видимости:

#include <memory>
#include <string>
#include <iostream>

std::unique_ptr<char[]> read_file(std::string name) {
    ....
    std::unique_ptr<char[]> buffer(new char[size+1]);
    ....
    return buffer;
}

int main()
{
  std::unique_ptr<char[]> buffer = read_file("main.cpp");
  if ( buffer[0] != 'A' )
  {
     std::cout << "data is invalid\n";
     return 1; // buffer is freed automatically
  }
  buffer.reset(); // can manually free if we are finished with buffer before it goes out of scope
  // data is valid
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...