inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C++

8.6 소멸자 destructor

소멸자, delete 질문

해결된 질문

516

얌냠냠

작성한 질문수 8

2

중요한 내용은 아닌 것 같지만 궁금해서 질문 올려봅니다.

8:06 쯤에 작성한 코드 delete[] my_int_arr.m_arr;처럼 쓰지 않고, 클래스 안에서 소멸자와 함께 delete를 쓴다... 는 것은 이해했습니다.

그런데 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?

c++

답변 1

2

Soobak

안녕하세요, 답변 도우미 Soobak 입니다. 😀😀

 

질문 ) 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?
: 네, 방법은 있습니다. 하지만 질문해주신 강의 3:45 부분의[보충] 설명, 그리고 강의 8.2 캡슐화, 접근 지정자, 접근 함수 전반에 걸쳐서 교수님께서 설명해주신 내용을 바탕으로 생각해보시면, 권장되지 않는 방법이라고 말씀드릴 수 있을 것 같습니다.

질문해주신 강의 8:06 부분의 코드를 발췌해보겠으며, 편의 상 '코드1' 로 후술하겠습니다.

#include <iostream>

using namespace std;

class IntArray
{
  private:
    int *m_arr = nullptr;
    int m_length = 0;

  public:
    IntArray(const int length_in)
    {
      m_length = length_in;
      m_arr = new int[m_length];

      cout << "Constructor" << endl;
    }

    int size() { return m_length; }
};

int main() {

  while (true)
  {
    IntArray my_int_arr(10'000);
  }

  return 0;
}

위 코드를 바탕으로 해당 강의 8:04 부분에서 delete[] my_int_arr.m_arr 을 통해 메모리를 해제 할 수 없었던 이유는 IntArray 클래스 내의 int *m_arr 변수의 접근 지정자가 private 으로 한정되어 있기 때문입니다.

따라서, 굳이 메모리가 동적으로 할당된 int *m_arr 변수를 main() 문에서 해제하고자 한다면,

아래와 같이 int *m_arr 변수의 접근 지정자를 public 으로 바꿔주면 가능합니다.

해당 코드는 편의상 '코드2'로 후술하도록 하겠습니다.

#include <iostream>

using namespace std;

class IntArray
{
  private:
    int m_length = 0;

  public:
    int *m_arr = nullptr;

    IntArray(const int length_in)
    {
      m_length = length_in;
      m_arr = new int[m_length];

      cout << "Constructor" << endl;
    }

    int size() { return m_length; }
};

int main() {

  while (true)
  {
    IntArray my_int_arr(10'000);
    delete[] my_int_arr.m_arr;
  }

  return 0;
}

 

⚗️코드 1에 대하여 메모리 누수 검사를 해보면 다음과 같습니다.
(제 컴퓨터 보호를 위해 아주 짧은 시간 동안 프로그램 실행 후 메모리 검사를 진행했습니다. 🥲)
image

⚗️ 코드 2에 대하여 메모리 누수 검사를 해보면 다음과 같습니다.
image

따라서, 질문자님의 질문 "만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?" 에 대해서는 "방법이 있습니다." 라고 답변드리는 것이 맞겠지만,

강의 8.2 캡슐화, 접근 지정자, 접근 함수 에서의 교수님께서 해주시는 설명, 그리고 질문해주신 강의 3:45 부분의[보충] 설명, 등을 참고하신다면 해당 방법은 적절하지 않은 방법이라고 말씀드리고 싶습니다.

객체 지향에 있어서 '캡슐화' 는 굉장히 중요한 개념 중 하나이니까요!

또한, 추후 섹션 15 에서 '스마트 포인터' 에 대하여 학습하신다면 메모리 관리에 대하여 보다 더 재미있고 깊이 있는 내용들을 학습하시게 될 것입니다!! 😀

 

학습 내용에 있어서 스스로 궁금증을 더 갖는 자세는 정말 바람직하신 자세라고 생각됩니다. 참 멋있으세요!👍

또 궁금하시거나 어려우신 점이 있으시다면, 언제든지 편하게 질문글 남겨주시면 감사하겠습니다. 😀

화이팅!

 

 

1

얌냠냠

정성 답변 감사드립니다!

delete 개념에 집중하다보니 접근 지정자의 영향력을 잊고 있었네요ㅎㅎ;;

강의자료는 어디서 받을 수 있죠?

1

36

2

교재 있나요?

1

142

2

11:11 부근에 Something::temp와 Something::getValue의 앞에 &를 붙이는 이유가 뭔가요? (함수 이름은 포인터(주소)가 아닌가요?)

1

95

3

using namespace std; 선언 후에 std::를 하는 이유가 궁금합니다

1

107

2

cstr직접구현

0

119

3

BubbleSort

1

80

2

숙제 마지막 부분

1

80

2

강의와 똑같이 진행했는데 링킹 에러가 발생합니다.

1

97

2

수업할때 레퍼런스로 사용하는 도서는 어떤 도서인가요??

1

165

2

공변반환형 관련 문의 드립니다.

1

92

2

170강 유니크 포인터에대해 질문있습니다

1

82

1

섹션 5 퀴즈의 답이 이상합니다

1

86

2

이중포인터와 배열이 이해가 안됩니다.

1

161

2

5분 17~5분 34초 객체 잘림 질문

1

80

1

Resource.h 코드 알려주세요

1

74

1

char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다

1

96

2

화면좌측 숫자 보이기

1

116

1

화면 좌측 숫자 보이기

0

68

1

처음 c++ 수강하려는데요. 비주얼스튜디오 2022 다운로드해서 설치하면 되는건가요??

1

139

3

46강 string 버퍼 질문입니다

1

82

2

프로그래머스 수열과 구간 쿼리 2 문제 질문입니다.

1

126

2

[] 범위 검사시 assert 사용 관련 질문

1

92

2

Lecture 클래스 멤버변수 명명 관련

0

94

2

프로그래머스의 대소문자 바꿔서 출력하기 문제를 푸는데요

0

76

1