• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

소멸자, delete 질문

23.03.21 02:04 작성 조회수 379

2

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

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

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

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2023.03.21

안녕하세요, 답변 도우미 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 에서 '스마트 포인터' 에 대하여 학습하신다면 메모리 관리에 대하여 보다 더 재미있고 깊이 있는 내용들을 학습하시게 될 것입니다!! 😀

 

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

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

화이팅!

 

 

얌냠냠님의 프로필

얌냠냠

질문자

2023.03.21

정성 답변 감사드립니다!

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