소멸자, delete 질문
중요한 내용은 아닌 것 같지만 궁금해서 질문 올려봅니다.
8:06 쯤에 작성한 코드 delete[] my_int_arr.m_arr;처럼 쓰지 않고, 클래스 안에서 소멸자와 함께 delete를 쓴다... 는 것은 이해했습니다.
그런데 만약에 main함수 속 while문 안에서 delete[]를 쓴다면, 강의처럼 m_arr에 빨간줄을 띄우지 않고 쓸 수 있는 방법이 있나요?
답변 1
2
안녕하세요, 답변 도우미 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
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





