inflearn logo
강의

Course

Instructor

C Programming for Hardcore Beginners

Call by reference and dynamic memory allocation issue

caller 가 메모리 할당 해제를 할 때의 문제점 질문

Resolved

65

Jonah Jameson

3 asked

0

 

안녕하세요. 본 강의에서 Callee 가 동적 메모리 주소를 반환하고, Caller 가 나중에 그 동적 메모리를 free 를 통해 해제하는 구조에 문제가 있다고 하셨는데, 어떤 문제가 있는 것인지 구체적으로 잘 감이 잡히지 않습니다.

멀티 스레딩과 연관지어 설명해주시면 감사하겠습니다.

c 컴퓨터-구조 assembly-language vc++

Answer 2

1

nullnull8537

문법적인 문제는 없습니다. 실수로 메모리를 해제하지 않을 가능성이 높아진다는 것이 큰 문제입니다. 각 스레드는 개별의 흐름을 갖습니다. 가령 T1에서 메모리를 할당한 후 T2~n에서 해제하는 구조일 때 무조건 경쟁조건이 발생합니다. 무엇보다 대상 메모리를 해제 하더라도 무방한 것인가에 대해 T1 스레드가 결정하는 논리적 구조를 가지고 있다면 더 복잡해집니다. 더욱이 이미 해제된 메모리를 다시 해제함으로써 발생하는 오류도 있습니다. 쓰고 보니...AI 답변과 같아지는 군요.

여기에 한 가지를 더 넣어 생각해보라는 의견을 드립니다. 보통 멀티스레드 환경에서 경쟁조건이 발생하는 자료구조는 Queue 입니다. Queue에 Node를 추가하는 스레드와 Queue에서 노드를 꺼내는 스레드가 분리되는 것이 보편적 구조인데 이와 관련지어 생각해보면 보다 구체적인 사례를 경험할 수 있습니다. 이런 내용을 고려해 생성형 AI에게 샘플을 만들어 달라고 하는 것을 추천합니다. 😄

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

Jonah Jameson님께서 질문하신 Callee가 동적 메모리 주소를 반환하고, Caller가 그 메모리를 해제하는 구조에서의 문제점에 대해 자세히 알아보겠습니다. 특히 멀티 스레딩 환경을 고려하면 이러한 구조에서 여러 가지 문제가 발생할 수 있습니다.

Callee가 메모리를 할당하고 이를 Caller에게 반환한 후, Caller가 메모리를 해제하는 구조는 몇 가지 문제를 야기할 수 있습니다. 가장 대표적인 문제는 메모리 관리 책임이 불명확해진다는 것입니다. Caller와 Callee가 각각 메모리에 대한 소유권을 가지게 되면, 어느 쪽이 메모리를 할당하고 해제해야 하는지에 대한 책임이 애매모호해질 수 있습니다.

특히 멀티 스레딩 환경에서 이러한 문제는 더욱 심각해질 수 있습니다. 여러 스레드가 동시에 메모리에 접근하고 관리하게 되면 다음과 같은 문제가 발생할 수 있습니다:

  1. 경합 상태(Race Condition): 두 스레드가 동시에 메모리를 해제하려고 할 때 발생할 수 있습니다. 이는 프로그램이 예측 불가능한 동작을 하게 만들며, 메모리 누수나 세그먼트 오류를 유발할 수 있습니다.

  2. 메모리 누수(Memory Leak): 어느 한쪽에서 메모리를 해제하지 않았을 경우, 메모리 누수가 발생할 수 있습니다. 이런 상황은 프로그램을 장기간 실행할 때 시스템 메모리 사용량이 증가되는 문제를 초래합니다.

  3. 이중 해제(Double Free): 메모리를 두 번 해제하려고 할 때 발생하며, 이는 프로그램의 충돌이나 변칙적인 동작을 초래할 수 있습니다.

이에 대한 해결책으로는 명확한 메모리 관리 정책을 수립하고, 어떤 객체가 메모리 해제를 책임질 것인지 역할을 명확히 정의하는 것이 중요합니다. 또한, 스레드 간의 동기화를 통해 이러한 문제를 수정할 수 있습니다.

관련된 질문과 답변 링크는 다음과 같습니다:

  1. 메모리 할당 해제 방법에 대한 질문

이 링크에서는 메모리 관리와 관련하여 메모리 할당 및 해제의 메커니즘에 대한 기본적인 이해를 돕는 답변이 제공되고 있습니다.

위 링크를 참고하시면 도움이 될 것 같습니다. 여러 스레드가 동시에 실행되는 상황에서는 특히 주의가 필요하므로, 동기화 및 메모리 관리에 대한 철저한 이해가 필요합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

scanf("%d\n") 의미

0

20

1

주소 연산자(&) 간접 지정자(*) 반대 개념

0

33

1

Virtual Memory, Memory, Memory mapping tables

0

52

1

샘플코드 출력 오류 발생 질문드립니다

0

64

2

값의 교환에 사용되는 변수의 위치.

0

89

2

메모리 비교에 관한 질문

0

82

2

문자열 Null

0

64

1

C, C++

0

90

2

문자열 입출력 코드 에러

0

61

2

선생님! 120화 2분 50초 질문입니다.

0

68

1

단축키 맞는지 여부 문의드립니다.

0

62

2

문자열을 사용하는 이중 포인터에 대하여 질문합니다

0

68

1

char 포인터 변수의 크기에 대하여 제가 이해한 것이 맞을까요

0

79

2

용어 설명 필요

0

59

2

stdin, stdout

0

72

2

필수 실습 (최댓값을 반환하는 함수)

0

94

2

아......ㅠㅠ

0

101

2

버퍼 내 엔터

0

74

1

2진수 뺄셈에서 carry-out

0

112

2

union 식별자는 실무에서 보통 어디에서 사용하나요?

0

81

2

필수실습문제 공부법 (진도 vs 복습)

0

105

2

예제파일 다운로드

0

80

2

Visial Studio Code 를 설치해서 사용해도 수업을 따라가는데 지장이 있나요?

0

121

3

연산자 기본이론 강의 질문

0

63

2