-
카테고리
-
세부 분야
프로그래밍 언어
-
해결 여부
해결됨
소멸자, delete 질문
23.03.21 02:04 작성 조회수 379
2
중요한 내용은 아닌 것 같지만 궁금해서 질문 올려봅니다.
8:06 쯤에 작성한 코드 delete[] my_int_arr.m_arr;처럼 쓰지 않고, 클래스 안에서 소멸자와 함께 delete를 쓴다... 는 것은 이해했습니다.
그런데 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?
답변을 작성해보세요.
2
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에 대하여 메모리 누수 검사를 해보면 다음과 같습니다.
(제 컴퓨터 보호를 위해 아주 짧은 시간 동안 프로그램 실행 후 메모리 검사를 진행했습니다. 🥲)
⚗️ 코드 2에 대하여 메모리 누수 검사를 해보면 다음과 같습니다.
따라서, 질문자님의 질문 "만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?" 에 대해서는 "방법이 있습니다." 라고 답변드리는 것이 맞겠지만,
강의 8.2 캡슐화, 접근 지정자, 접근 함수 에서의 교수님께서 해주시는 설명, 그리고 질문해주신 강의 3:45 부분의[보충] 설명, 등을 참고하신다면 해당 방법은 적절하지 않은 방법이라고 말씀드리고 싶습니다.
객체 지향에 있어서 '캡슐화' 는 굉장히 중요한 개념 중 하나이니까요!
또한, 추후 섹션 15 에서 '스마트 포인터' 에 대하여 학습하신다면 메모리 관리에 대하여 보다 더 재미있고 깊이 있는 내용들을 학습하시게 될 것입니다!! 😀
학습 내용에 있어서 스스로 궁금증을 더 갖는 자세는 정말 바람직하신 자세라고 생각됩니다. 참 멋있으세요!👍
또 궁금하시거나 어려우신 점이 있으시다면, 언제든지 편하게 질문글 남겨주시면 감사하겠습니다. 😀
화이팅!
답변 1