new, delete
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์์ฒด์ ์ ์์ฒญํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ด์์ฒด์ ๋ ํ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ก์ ์ ์์ผ๋ฉด ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ํ๋ก๊ทธ๋จ์ ๋ฐํํ๋ค. (delete)
๋์ ์ผ๋ก ํ ๋น๋ ๋ณ์๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์์ ์ฌํ ๋น๋ ์ ์๊ฒ ํด์ผํ๋ค.
ํ์ง๋ง delete๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ ๋ฟ ํฌ์ธํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ์๋๋ค.
๋ฐ๋ผ์ delete ์งํ์ ํด๋น ํฌ์ธํฐ๋ ํ ๋น ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ dangling pointer๊ฐ ๋๋ค.
dangling pointer๋ฅผ ์ญ์ฐธ์กฐํ๊ฑฐ๋ ๋ค์ deleteํ๋ฉด ์ ์๋์ง ์์ ๋์์ด ๋ฐ์ํ๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, delete ํ ํด๋น ํฌ์ธํฐ๋ฅผ nullptr๋ก ์ค์ ํ์.
๋ง์ฝ ๋ค๋ฅธ ํฌ์ธํฐ๊ฐ (delete๋) ๊ฐ์ ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๋ฉด ํด๋น ํฌ์ธํฐ๋ nullptr๋ก ์ค์ ํ์.
(๊ฐ๋ฅํ๋ฉด ์ฌ๋ฌ ํฌ์ธํฐ๊ฐ ๊ฐ์ ๋์ ํ ๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ ํผํ์.)
๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ๋ฐ์ํ ์ ์๋ ๋ค๋ฅธ ๋ฌธ์ ๋ memory leak์ด๋ค.
memory leak๋ ํ๋ก๊ทธ๋จ์ด ๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ทธ๋ฌ๋ฉด ํ๋ก๊ทธ๋จ์ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด์์ฒด์ ์ ์ฅ์์๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ ์ค์ด๋ฏ๋ก ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ฌํ ๋นํ ์ ์๋ค.
๋์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ (delete ์์ด) ๋ค๋ฅธ ์ฃผ์๊ฐ์ด ํ ๋น๋๊ฑฐ๋, ํ ํฌ์ธํฐ์ (delete ์์ด) ๋ ๋ฒ์ด์ ๋์ ํ ๋น๋๋ฉด memory leak๊ฐ ๋ฐ์ํ๋ค.
int* p = new int;
delete p;
p = nullptr;
p = new int[10];
delete[] p;
p = nullptr;
Reference:
https://boycoding.tistory.com/204
https://en.cppreference.com/w/cpp/memory/new/operator_delete
class, inheritance
ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก private์ด๋ค.
binding, virtual function
binding์ด๋ ํจ์ ํธ์ถ๋ถ๋ฅผ ์ด๋ ๋ธ๋ก์ ์๋ ํจ์๋ก ์ฐ๊ฒฐํ ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
static binding์ ์ปดํ์ผ ํ์์, dynamic binding์ ๋ฐํ์์ binding ์ฃผ์๋ฅผ ๊ฒฐ์ ํ๋ค.
์ผ๋ฐ ํจ์๋ static binding ๋๊ธฐ ๋๋ฌธ์ upcastingํ ๊ฒฝ์ฐ ๋ถ๋ชจ ํด๋์ค์ ํจ์๊ฐ ํธ์ถ๋๋ค.
๊ฐ์ ํจ์๋ dynamic binding ๋๊ธฐ ๋๋ฌธ์ upcastingํ ๊ฒฝ์ฐ ์์ ํด๋์ค ํจ์ ํธ์ถ์ด ๊ฐ๋ฅํด์ง๋ค.
* upcasting: ์์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ๋ถ๋ชจ ํด๋์ค์ ํฌ์ธํฐ๋ก ๊ฐ๋ฆฌํค๋ ๊ฒ
๋ถ๋ชจ ํด๋์ค์ ์ด๋ค ๋ฉ์๋๋ฅผ ๊ตฌํํด๋ ์ ์๋ (ํน์ ๊ตฌํํ๊ณ ์ถ์ง ์์) ๊ฒฝ์ฐ์๋ ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ๋ น Person ํด๋์ค๋ฅผ ์์๋ฐ๋ Student์ Teacher ํด๋์ค๊ฐ ๊ณตํต์ผ๋ก addCourse(string s) ๋ฉ์๋๊ฐ ํ์ํ๋ค๊ณ ํ์. Student์์์ addCourse()์ Teacher์์์ addCourse()์ ๊ตฌํ ์์ฒด๊ฐ ๋ค๋ฅด๋ฏ๋ก Person ํด๋์ค์์ addCourse()๋ฅผ ์ง์ ํธ์ถํ๋ค๋ ๊ฒ์ ๋ง์ด ๋์ง ์๋๋ค.
์ด ๊ฒฝ์ฐ Person ํด๋์ค์ addCourse()๋ ์์ ๊ฐ์ ํจ์(pure virtual function)๋ก ์ ์ธํ์ฌ ๊ตฌํ์ ์์ ํด๋์ค๋ค์๊ฒ ๋งก๊ฒจ์ผ ํ๋ค.
์์ ๊ฐ์ ํจ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ํด๋์ค๋ ์ค์ค๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ผ ์ ์๋ ์ถ์ ํด๋์ค(abstract class)๊ฐ ๋๋ค.
#include<iostream>
#define NAME_SIZE 50
using namespace std;
class Person {
int id;
char name[NAME_SIZE];
public:
void aboutMe(){
cout << "I am a person.";
}
};
class Student : public Person {
public:
void aboutMe(){
cout << "I am a student.";
}
};
int main()
{
Student* p = new Student();
p->aboutMe(); // "I am a student."
delete p;
Person* q = new Student();
q->aboutMe(); // "I am a person."
return 0;
}
์ ์ฝ๋์์ Person์ aboutMe()๋ฅผ virtual๋ก ์ ์ธํ๋ฉด q->aboutMe()์์ "I am a student."๊ฐ ์ถ๋ ฅ๋๋ค.
Person์ ์์ ๊ฐ์ ํจ์ addCourse()๋ฅผ ์ ์ธํ๋ฉด Person ํด๋์ค๋ ์ถ์ ํด๋์ค๊ฐ ๋๋ค.
์๋ฉธ์๋ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋ ์๋์ผ๋ก ํธ์ถ๋๋ค. ํด๋์ค ๋ด์์ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํด์ฃผ์ด์ผ ํ๋ค.
์๋ฉธ์๋ ๊ฐ์ ์๋ฉธ์๋ก ์ ์ธํ ์ ์์ผ๋ฉฐ upcasting ์์๋ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐํํ ์ ์๋ค.
Reference:
์ฝ๋ฉ ์ธํฐ๋ทฐ ์์ ๋ถ์ ์ฑ
https://junsday.tistory.com/22
ํฌ์ธํฐ์ ์ฐธ์กฐ
ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ๋ 32bit ๋จธ์ ์์ 32bit, 64bit ๋จธ์ ์์ 64bit์ด๋ค.
์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ํ์ํ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๋ฌป๋๋ค๋ฉด ์ฐธ๊ณ ํ์.
์ฐธ์กฐ๋ ๊ธฐ์กด์ ์กด์ฌํ๋ ๊ฐ์ฒด์ ๋ถ๋ ๋ ๋ค๋ฅธ ์ด๋ฆ์ด๋ฉฐ, ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง ์๋๋ค.
ํฌ์ธํฐ์ ๋ฌ๋ฆฌ ์ฐธ์กฐ๋ null์ด ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์ฌํ ๋น๋ ์๋ ์๋ค.
Reference:
์ฝ๋ฉ ์ธํฐ๋ทฐ ์์ ๋ถ์ ์ฑ
'Problem Solving > C++ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฒ์ ๊ธฐ๋ฐ ํฌ๋ฌธ (Range-based for loop) (0) | 2020.06.01 |
---|---|
C++ ์์ฐจ ์ปจํ ์ด๋ (vector, deque, list) (0) | 2020.05.31 |
C++14 STL ์ฒ ์ ์ ๋ฌธ) vector (0) | 2020.05.20 |
C++ #4: preprocessor directives (0) | 2019.12.07 |
C++ #3: call by value, address, reference (0) | 2019.12.06 |
๋๊ธ