๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Problem Solving/C++ ์ •๋ฆฌ

C++ specificํ•œ ๋‚ด์šฉ๋“ค ์ •๋ฆฌ (C C++ ์ฐจ์ด)

by ํ–‰๋ฑ 2020. 6. 30.

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

https://lesslate.github.io/cpp/%EC%97%85-%EC%BA%90%EC%8A%A4%ED%8C%85-%EB%8B%A4%EC%9A%B4-%EC%BA%90%EC%8A%A4%ED%8C%85/

 


ํฌ์ธํ„ฐ์™€ ์ฐธ์กฐ

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ํฌ๊ธฐ๋Š” 32bit ๋จธ์‹ ์—์„œ 32bit, 64bit ๋จธ์‹ ์—์„œ 64bit์ด๋‹ค.

์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด ์ฐธ๊ณ ํ•˜์ž.

 

์ฐธ์กฐ๋Š” ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด์— ๋ถ™๋Š” ๋˜ ๋‹ค๋ฅธ ์ด๋ฆ„์ด๋ฉฐ, ๋ณ„๋„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค.

ํฌ์ธํ„ฐ์™€ ๋‹ฌ๋ฆฌ ์ฐธ์กฐ๋Š” null์ด ๋  ์ˆ˜ ์—†์œผ๋ฉฐ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ์žฌํ• ๋‹น๋  ์ˆ˜๋„ ์—†๋‹ค.

 

Reference:

์ฝ”๋”ฉ ์ธํ„ฐ๋ทฐ ์™„์ „๋ถ„์„ ์ฑ…

๋Œ“๊ธ€