htc_refactor   4년 전

아래는 제가 2562번 문제 풀면서 작성한 코드인데 제출했을 때 메모리 초과로 인한 오답 으로 채점되었습니다.

7행을 잘못 작성한게 가장 큰 이유였습니다. (vector <int> numbers(10, 0);으로 썼어야 했습니다)

궁금한 점은 아래 코드를 제출하면 "메모리 초과"가 나오는데, 2562번 문제의 메모리 제한은 128MB 입니다.

아래 코드가 128MB의 메모리 제한을 초과할 경우가 있나요?

읽어주셔서 감사합니다.

dyk777   4년 전

수정 전의 7번 줄에 의해서는 numbers 벡터는 그 원소가 10과 0의 두개 뿐인, 즉 그 크기가 2인 벡터입니다.

이 벡터에 대해서 범위 밖의 메모리에 대입/참조를 하고 있고, 이는 UB입니다.

htc_refactor   4년 전

말씀하신 UB는 "Undefined Behavior"를 지칭하시는 것으로 이해했습니다.

하지만 제가 이론적 배경을 잘 몰라서 UB랑 메모리 초과 연결을 못 짓겠습니다.

저는 위 코드가 메모리 제한 128MB를 초과하는 이론적 배경이 궁금합니다.

범위 밖의 메모리에 대한 대입/참조는 메모리 사용을 늘리나요?

dyk777   4년 전

범위밖에 대한 메모리에 대한 접근이 직접적으로 메모리 사용량을 늘린다는 것은 아니구요.

상황이 UB이니만큼 정확한 해석은 어렵겠지만, 다음과 같은 경우가 아닐까 감히 추측해봅니다.

vector에서 원소들이 실제로 포함되는 부분이 아닌, 그것에 대한 정보를 가지고 있는 메모리가 따로 있어서 두 부분이 만약 인접해 있다면,

범위를 초과하여 입력할 때 그 부분의 값이 잘못 덮어씌워지게 될 것입니다.

그런데 잘못 덮어 씌운 값이 만약 원소들이 실제로 포함되는 부분의 실제 주소와 관련이 있다면

다음 접근부터는 입력값에 의해 잘못 덮어씌워진 주소에 임의 접근을 할 것이구요.

그 주소가 원래 주소와 차이가 많이 나면, 그 사이의 메모리를 모두 사용한 것으로 생각하여 메모리 초과가 난 것은 아닐까 생각되네요.

dyk777   4년 전

혹은, main의 scope에 있는 vector와 for의 scope에 있는 i가 매우 인접하여, 입력을 받은 값이 i에 영향을 주게 되었고, 그 때문에 루프가 의도한대로 동작하지 않았을 가능성도 있겠군요.

정확한 이유는 잘 모르겠지만, 하여간 out of range가 메모리 사용량을 직접적으로 늘리는 것은 아닙니다.

djm03178   4년 전

단순히 잘못된 주소에 쓰는 것만으로 메모리 초과로 판정되지는 않습니다. 할당을 그만큼 받아야 됩니다.

범위를 침범하여 잘못된 주소에 접근한 것 때문에, 어떤 메모리를 할당받는 명령이 무한히 실행되거나 매우 큰 메모리를 할당받는 명령이 만들어지도록 프로그램의 로직이 바뀌었다고 보는 게 가능성 있는 이야기겠네요.

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