인프런 커뮤니티 질문&답변
caller 가 메모리 할당 해제를 할 때의 문제점 질문
해결된 질문
작성
·
32
0
안녕하세요. 본 강의에서 Callee 가 동적 메모리 주소를 반환하고, Caller 가 나중에 그 동적 메모리를 free 를 통해 해제하는 구조에 문제가 있다고 하셨는데, 어떤 문제가 있는 것인지 구체적으로 잘 감이 잡히지 않습니다.
멀티 스레딩과 연관지어 설명해주시면 감사하겠습니다.
답변 2
1
문법적인 문제는 없습니다. 실수로 메모리를 해제하지 않을 가능성이 높아진다는 것이 큰 문제입니다. 각 스레드는 개별의 흐름을 갖습니다. 가령 T1에서 메모리를 할당한 후 T2~n에서 해제하는 구조일 때 무조건 경쟁조건이 발생합니다. 무엇보다 대상 메모리를 해제 하더라도 무방한 것인가에 대해 T1 스레드가 결정하는 논리적 구조를 가지고 있다면 더 복잡해집니다. 더욱이 이미 해제된 메모리를 다시 해제함으로써 발생하는 오류도 있습니다. 쓰고 보니...AI 답변과 같아지는 군요.
여기에 한 가지를 더 넣어 생각해보라는 의견을 드립니다. 보통 멀티스레드 환경에서 경쟁조건이 발생하는 자료구조는 Queue 입니다. Queue에 Node를 추가하는 스레드와 Queue에서 노드를 꺼내는 스레드가 분리되는 것이 보편적 구조인데 이와 관련지어 생각해보면 보다 구체적인 사례를 경험할 수 있습니다. 이런 내용을 고려해 생성형 AI에게 샘플을 만들어 달라고 하는 것을 추천합니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
Jonah Jameson님께서 질문하신 Callee가 동적 메모리 주소를 반환하고, Caller가 그 메모리를 해제하는 구조에서의 문제점에 대해 자세히 알아보겠습니다. 특히 멀티 스레딩 환경을 고려하면 이러한 구조에서 여러 가지 문제가 발생할 수 있습니다.
Callee가 메모리를 할당하고 이를 Caller에게 반환한 후, Caller가 메모리를 해제하는 구조는 몇 가지 문제를 야기할 수 있습니다. 가장 대표적인 문제는 메모리 관리 책임이 불명확해진다는 것입니다. Caller와 Callee가 각각 메모리에 대한 소유권을 가지게 되면, 어느 쪽이 메모리를 할당하고 해제해야 하는지에 대한 책임이 애매모호해질 수 있습니다.
특히 멀티 스레딩 환경에서 이러한 문제는 더욱 심각해질 수 있습니다. 여러 스레드가 동시에 메모리에 접근하고 관리하게 되면 다음과 같은 문제가 발생할 수 있습니다:
경합 상태(Race Condition): 두 스레드가 동시에 메모리를 해제하려고 할 때 발생할 수 있습니다. 이는 프로그램이 예측 불가능한 동작을 하게 만들며, 메모리 누수나 세그먼트 오류를 유발할 수 있습니다.
메모리 누수(Memory Leak): 어느 한쪽에서 메모리를 해제하지 않았을 경우, 메모리 누수가 발생할 수 있습니다. 이런 상황은 프로그램을 장기간 실행할 때 시스템 메모리 사용량이 증가되는 문제를 초래합니다.
이중 해제(Double Free): 메모리를 두 번 해제하려고 할 때 발생하며, 이는 프로그램의 충돌이나 변칙적인 동작을 초래할 수 있습니다.
이에 대한 해결책으로는 명확한 메모리 관리 정책을 수립하고, 어떤 객체가 메모리 해제를 책임질 것인지 역할을 명확히 정의하는 것이 중요합니다. 또한, 스레드 간의 동기화를 통해 이러한 문제를 수정할 수 있습니다.
관련된 질문과 답변 링크는 다음과 같습니다:
이 링크에서는 메모리 관리와 관련하여 메모리 할당 및 해제의 메커니즘에 대한 기본적인 이해를 돕는 답변이 제공되고 있습니다.
위 링크를 참고하시면 도움이 될 것 같습니다. 여러 스레드가 동시에 실행되는 상황에서는 특히 주의가 필요하므로, 동기화 및 메모리 관리에 대한 철저한 이해가 필요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





