otter66   3년 전

문제의 정답 딱지는 받았지만..

아래의 코드가 백준, repl에서는 실행이 되지만
visual에서는 오류가 발생합니다
20번째 줄에서 예외 발생으로 종료되는 이유가 궁금합니다. 

arcane915   3년 전

visual studio에서는 컴파일러로서 msvc를 사용하는데, 동적 배열 할당을 지원하지 않아서

배열의 크기를 변수에 받아서 선언하고자 할 때에는 포인터를 사용해야 합니다.

otter66   3년 전

이전에 문제를 풀 때 위의 코드처럼 배열의 크기를 조건에 맞게 

미리 정수로 지정 해주어서 풀었는데, 오류가 없었습니다ㅠㅠ.

제가 동적 배열 할당에 대해서 잘 몰라서...

배열의 크기를 동적으로 할당한다는 것은 vector처럼 배열의 크기가 유동적인 것을 의미하는 것이 아닌가요??

sait2000   3년 전

맨 밑에 줄에서 존재하지 않는 밑의 줄의 정보를 읽으려고 해서 오류가 나는 게 아닐까요??

otter66   3년 전

dfs함수 안의 if문에서 예외가 발생합니다..ㅠㅠ

ckdgus2482   3년 전

일단 로직에 문제가 있는것은 맞습니다.

올려주신 코드 그대로 복붙해서 디버깅 해보니 예제 입력에서 N이 5인데 20번째줄에 x가 4인 경우가 있었습니다.

그러면 arr[x + 1]은 입력을 받지 않는 string이죠.

string은 vector를 기반으로 하고 있는데 생성자에서 사이즈를 명시해주지 않으면 사이즈가 0입니다.

다만 capacity를 어떻게 늘릴 것인지 capacity의 초기 값은 몇으로 할건지는 c++ 명세에서 명시하지 않고 있어서 컴파일러마다 구현이 다를 수 있는데 일단 경험상 vs의 경우는 capacity도 0이었습니다.

size 범위를 벗어나지만 capacity 안에 들어오는 위치에 대한 액세스는 명백한 버그 상황이 맞긴하나 []연산자에 대해서는 bufferoverflow가 발생했을때 어떻게 처리해야하는지도 표준에서는 자율에 맞기고 있습니다. 위 코드로 정답처리 받으셨다면 BOJ 채점에서 쓰는 gcc의 빌드옵션에서는 이러한 버그 상황에 좀 관대한 것 같습니다.

C++ 표준 명세에서는 operator[]가 아닌 at메서드인 경우 익셉션을 throw하도록 명시하고 있고 gcc 등에서도 위 코드의 [] 대신 at을 쓰면 런타임 에러가 발생할 것입니다.

ckdgus2482   3년 전

좀 보충하자면

size에서는 벗어나고 capacity에는 들어오는 []액세스의 경우 구현상 허용해도 문제가 되지 않는 이유는 그 공간은 어차피 그 벡터가 예약해둔 메모리기 때문에 메모리 자체에 대한 오너십은 그 벡터에게 있기 때문입니다.

otter66   3년 전

아.. 정말 정말 감사합니다 덕분에 좀 더 알게되었습니다. 감사합니다!!

댓글을 작성하려면 로그인해야 합니다.