반응형

 

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

 

vscode로 알고리즘 문제를 풀다가 발생한 오류입니다.

"std::bad_alloc"을 검색해보니 일반적으로 힙 메모리(Heap Memory)가 부족할 때, 더 이상 메모리를 동적으로 할당할 수 없을 때 발생하는 현상이라고 합니다.

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int N, M, ans;
bool visited[1001];
int bm[1001]; // Bipartite Matching
vector<vector<int>> node(1001);

bool DFS(int personNum)
{
    if (visited[personNum])
        return false;
    visited[personNum] = true;
    for (int i = 0; i < node[personNum].size(); i++)
    {
        int workNum = node[personNum][i];
        if (bm[workNum] == 0 || DFS(bm[workNum]))
        {
            bm[workNum] = personNum;
            return true;
        }
    }
}

void initVisited()
{
    for (int i = 1; i <= N; i++)
    {
        visited[i] = false;
    }
}

int main()
{
    freopen("input.txt", "r", stdin);

    cin >> N >> M;

    for (int i = 1; i <= M; i++)
    {
        int ea, workNum; // 일의 개수, 번호
        for (int j = 1; j <= ea; j++)
        {
            cin >> workNum;
            node[i].push_back(workNum);
        }
    }

    for (int i = 1; i <= N; i++)
    {
        initVisited();
        if (DFS(i))
            ans++;
    }

    cout << ans;
}

"힙 메모리가 부족하다고요??" 코드상으로 전역으로 배열 크기를 1001로 설정해준 것은 문제가 없어 보이고 하나씩 주석처리를 하다가 찾아보니

 

ea라는 변수를 선언하고 cin으로 받아야 하는데 cin으로 받지 않아 초기화되지 않은 ea로 인해 ea에는 쓰레기 값이 들어가게 되고 이로 인해 node라는 벡터에 계속해서 값들이 push_back 되어 힙 메모리 부족 현상이 발생했던 것입니다.

 

ea선언 후 초기화나 값을 받지 않은 상태에서 출력시 쓰레기값이 나오는 것을 확인할 수 있음

 

해당 오류가 발생하신다면 할당된 메모리를 반납하지 않고 잦은 힙 메모리 할당, 삭제로 인해 메모리 단편화가 많이 발생하게 되어 원하는 크기의 힙 메모리를 할당할 수 없는지 꼭 확인해보시길 바랍니다.

 

 

 

반응형

+ Recent posts