Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Erro no código

O meu código está rodando o cabeçalho, mas não consegue imprimir o restante da aplicação, pois dá um erro:

terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

Como eu posso consertar isso? Obs: o arquivo palavras está idêntico ao utilizado pelo professor

#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <fstream>
#include <ctime>
#include <cstdlib>
using namespace std;

string palavra_secreta = "MELANCIA";
map<char, bool> chutou;
vector<char> chutes_errados;

bool letra_existe(char chute)
{
    for (char letra : palavra_secreta)
    {
        if (chute == letra)
        {
            return true;
        }
    }
    return false;
}

bool nao_acertou()
{
    for (char letra : palavra_secreta)
    {
        if (!chutou[letra])
        {
            return true;
        }
    }
    return false;
}

bool nao_enforcou()
{
    return chutes_errados.size() < 5;
}

void imprime_cabecalho()
{
    cout << "*********************" << endl;
    cout << "*** Jogo da Forca ***" << endl;
    cout << "*********************" << endl;
    cout << endl;
}

void imprime_erros()
{
    cout << "Chutes errados: ";
    for (char letra : chutes_errados)
    {
        cout << letra << " ";
    }
    cout << endl;
}

void imprime_palavra_secreta()
{
    for (char letra : palavra_secreta)
    {
        if (chutou[letra])
        {
            cout << letra << " ";
        }
        else
        {
            cout << "_ ";
        }
    }
    cout << endl;
}

void tratando_chute()
{
    cout << "Informe o seu chute: " << endl;
    char chute;
    cin >> chute;

    chutou[chute] = true;

    if (letra_existe(chute))
    {
        cout << "Você acertou, essa letra está na palavra!" << endl;
    }
    else
    {
        cout << "Você errou, essa letra não existe na palavra!" << endl;
        chutes_errados.push_back(chute);
    }
    cout << endl;
}

vector<string> le_arquivo()
{
    ifstream arquivo;
    arquivo.open("palavras.txt");

    int quantidade_palavras;
    arquivo >> quantidade_palavras;

    vector<string> palavras_do_arquivo;

    for (int i = 0; i < quantidade_palavras; i++)
    {
        string palavra_lida;
        arquivo >> palavra_lida;
        palavras_do_arquivo.push_back(palavra_lida);
    }
    return palavras_do_arquivo;
}

void sorteia_palavra()
{
    vector<string> palavras = le_arquivo();

    srand(time(NULL)); 
    int indice_sorteado = rand() % palavras.size();

    palavra_secreta = palavras[indice_sorteado];
}

int main()
{
    imprime_cabecalho();

    le_arquivo();

    sorteia_palavra();

        while (nao_acertou() && nao_enforcou())
    {
        imprime_erros();

        imprime_palavra_secreta();

        tratando_chute();
    }

    cout << "A palavra secreta era " << palavra_secreta << endl;
    cout << "Fim de jogo" << endl;
    if (nao_acertou())
    {
        cout << "Você perdeu, tente novamente!" << endl;
    }
    else
    {
        cout << "Parabéns, você acertou a palavra secreta!" << endl;
    }
}
2 respostas
solução!

Olá, Nyelton! Parece que você está enfrentando um erro de 'std::bad_alloc'. Esse erro geralmente ocorre quando o programa não consegue alocar memória suficiente.

Analisando o seu código, parece que o problema pode estar na função 'le_arquivo()'. O erro 'std::bad_alloc' pode ser causado por uma tentativa de alocar uma grande quantidade de memória, o que pode estar acontecendo se o arquivo 'palavras.txt' não estiver sendo lido corretamente e o programa tentar alocar mais memória do que está disponível.

Uma sugestão seria tentar adicionar uma verificação para garantir que o arquivo foi aberto corretamente antes de tentar ler dele. Algo assim:

vector<string> le_arquivo()
{
    ifstream arquivo;
    arquivo.open("palavras.txt");
    
    if (!arquivo) {
        cout << "Não foi possível abrir o arquivo palavras.txt" << endl;
        return {};
    }

    int quantidade_palavras;
    arquivo >> quantidade_palavras;

    vector<string> palavras_do_arquivo;

    for (int i = 0; i < quantidade_palavras; i++)
    {
        string palavra_lida;
        arquivo >> palavra_lida;
        palavras_do_arquivo.push_back(palavra_lida);
    }
    return palavras_do_arquivo;
}

Se o arquivo não puder ser aberto, a função agora retornará um vetor vazio e imprimirá uma mensagem de erro. Isso deve ajudar a identificar se o problema está na leitura do arquivo.

Outra sugestão seria verificar se o arquivo 'palavras.txt' está no mesmo diretório que o seu arquivo de código. Se não estiver, você precisará fornecer o caminho completo para o arquivo.

Espero ter ajudado, qualquer coisa manda aqui de novo. Bons estudos!

Deu certo!! O problema estava na organização da pasta e dos arquivos.