C совет по исключению handlng - PullRequest
0 голосов
/ 04 марта 2019

Поскольку я довольно новичок в C ++, у меня возникли проблемы с исключением обработки для моего школьного задания.Я никогда раньше не касался исключения.

Что мне нужно сделать для моего задания, так это создать механизм исключения, чтобы вычислить, сколько памяти (в МБ) можно выделить в программе.

Я должен использовать оператор new[] и catch() и ограничен использованием только одной переменной.

Я пробовал коды, и это то, что я до сих пор.Я не знаю, нахожусь ли я на правильном пути или нет.Любой совет приветствуется.Спасибо.

int main() {

  char *mem;

  unsigned long long count = 1;

  while (1) {
    mem = new char[1025 * 1054];
    if (mem == NULL)
      break;

    free(mem);
    count++;
  }

  std::cout << "count: " << count * 1024000;
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

void* operator new ( std::size_t count ); вызовет исключение std::bad_alloc при неудачном выделении памяти.

Все, что вам нужно сделать, - это создать функцию allocate, которая вызывает себя с меньшим объемом памяти при сбое;например, вы могли бы сделать что-то вроде этого:

#include <iostream>

void allocate_me(size_t size)
{
    try{
        uint64_t* a = new uint64_t[size] ;
        std::cout << "Size is : " << size << std::endl;
    }
    catch(std::bad_alloc &e)
    {
        allocate_me(size-1024);
    }
}

int main()
{
    size_t var = 1024*1024*1024;
    allocate_me(var);
    std::cout << "Hello, world!\n";
}

Обратите внимание, что начальный объем памяти и уменьшение зависят от вашей системы.

Другим решением может быть просто посмотреть доступную оперативную память вLinux, вы можете использовать sysinfo или заглянуть в файл /proc/meminfo - и начать с этого момента.

0 голосов
/ 04 марта 2019

Предупреждение, что free недопустимо и имеет неопределенное поведение, способ удалить выделенную память - delete [] mem;

Из-за этого бесполезно делать new затем удалить в цикле, если вы хотите проверить предельный размер выделения, который вам не нужно удалять (и, конечно, не бесплатно)

Если вы хотите узнать максимальный размер непрерывный блок делает начальный malloc , затем realloc в цикле, увеличивая размер до NULL

Например

#include <stdlib.h>
#include <iostream>

int main() {
  void * mem = malloc(0);
  size_t count = 0;

  while ((mem = realloc(mem, (++count)*1024*1024)) != NULL)
    ;

  free(mem);

  std::cout << "count: " << --count << "Mb" << std::endl;
}

Обратите внимание, что программа не записывает данные в выделенную память, поэтому я могу выполнить ее на моем Raspberry Pi без убийства , при этом происходит своп:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc 
pi@raspberrypi:/tmp $ ./a.out
count: 1023Mb
pi@raspberrypi:/tmp $ 

Использование C ++ new :

#include <stdlib.h>
#include <iostream>

int main() {
  char * mem;
  size_t count = 0;

  try {
    while (true) {
      mem = new char [(++count)*1024*1024];
      delete [] mem;
    }
  }
  catch (std::bad_alloc &) {
  }

  std::cout << "count: " << --count << "Mb" << std::endl;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra a.cc 
pi@raspberrypi:/tmp $ ./a.out
count: 543Mb

Результат не совпадает, он более реалистичен и соответствует свободной памятиУ меня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...