Quando alocação de memória falha (C++)

Talvez por costume com linguagem C e trabalhar com legacy code (alocando com malloc), já vi (e também fiz) isso em alguns projetos:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new char[2047 * MB];

  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
  }
}

Verificar se a variável mem é válida após alocar memória é algo correto a se fazer, não? Quase. No código C++ acima, o else nunca será executado: quando os quase 2GB alocados acima são realmente alocados, o if é executado. Mas quando não é possível alocar a memória, o que ocorre é uma exceção (std::bad_alloc) e o else não é executado.

Poderia reescrever com um try-catch:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  try
  {
    char *mem = new char[2047 * MB];

    if (mem)
    {
      std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
      delete[] mem;
    }
  }
  catch(const std::bad_alloc &exception)
  {
    std::cerr << "Exception: " << exception.what() << std::endl;
    return 666;
  }
}

Ou então poderia alocar usando new(std::nothrow), que retorna um ponteiro null quando não é possível alocar memória:

#include <iostream>

int main(int argc, char *argv[])
{
  const int MB = 1048576;

  char *mem = new(std::nothrow) char[2047 * MB];
  
  if (mem)
  {
    std::cout << "Almost 2GB of memory successfully allocated!" << std::endl;
    delete[] mem;
  }
  else
  {
    std::cout << "Bad allocation!" << std::endl;
    return 666;
  }
}
Be Sociable, Share!

2 thoughts on “Quando alocação de memória falha (C++)

  1. Roger

    Sim, makes sense!

    A única coisa que eu não gosto é o jeito da standard de std::cout << fazer o printf << std:endl :)

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>