<개인공부>/[C++]

[C++] new, delete 동적할당과 해제에 대해서

BlockDMask 2018. 12. 4. 22:54
반응형

안녕하세요 BlockDMask 입니다.

오늘은 C++의 동적할당 new, delete에 대해서 알아보겠습니다.


<목차>

1. C++ 동적할당 new, delete란? (간단 설명)
2. C++ 동적할당 new, delete 추가설명
3. C++ new, delete 예제
4. C++ 동적할당 결론




1. new와 delete란? (간단 설명)


C언어 에서의 동적할당 malloc과 free와 동일한 역할을 하는 new와 delete입니다.

간단하게 말해서 메모리를 힙에 동적할당을 할라면 new사용하고 메모리 해제 하려면 delete 사용하면됩니다.


C언어 동적할당을 간단하게 보면 아래와 같은 방식으로 동작하는 것을 알 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Position
{
    int a;
    int b;
};
 
//C++ 스타일의 동적할당과 해제 (new와 delete)
int main()
{
    Position* ptr = (Position*)malloc(sizeof(Position));
 
    //
    //할당된 메모리로 여러 작업을 수행한다.
    //
 
    free(ptr);        //메모리해제.
    return 0;
}
cs



C++스타일의 동적할당을 간단하게 보면 아래와 같이 사용할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Position
{
    int a;
    int b;
};
 
//C++ 스타일의 동적할당과 해제 (new와 delete)
int main()
{
    Position* ptr = new Position;
 
    //
    //할당된 메모리로 여러 작업을 수행한다.
    //
 
    delete ptr;        //메모리해제.
    return 0;
}
cs






2. new와 delete란? (상세 설명)


하지만, 사실 malloc == new ? 절대 같지 않습니다.


위에서 예제를 보면 malloc과 new가 같아보이지만 C++의 new는 훨씬 다양한 것을 해줍니다.


new는 힙에 메모리할당을 해주고 생성자를 호출해주며 해당 타입으로 변환까지 해주는 다재다능한 친구입니다.



new가 하는일에 대해서 다시한번 말씀드릴게요 굉장히 중요합니다.
(1) 메모리 할당
(2) 생성자 호출
(3) 타입변환



그럼 delete는 무엇을할까요?
네 맞습니다. 소멸자를 호출해주고 메모리를 해제해줍니다.


다시한번 말씀드릴게요 delete
(1) 소멸자 호출
(2) 메모리 해제

아래 예제에서 비교해봅시다.




3. 예제 - new, delete 가 하는일을 출력해보자.



1-1) malloc, free을 이용했을때.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
 
class Position //클래스입니다.
{
public:
    Position()    //생성자
    {
        cout << "2) new에 의해 생성자 호출됨" << endl;
    }
    ~Position() //소멸자
    {
        cout << "3) delete에 의해 소멸자 호출됨" << endl;
    }
};
 
//C++ 스타일의 동적할당과 해제 (new와 delete)
int main()
{
    Position* ptr = (Position*)malloc(sizeof(Position));
    cout << "1) malloc - 메모리 할당 끝 : 생성자는 불렸나?" << endl;
    free(ptr);        //메모리해제.
    system("pause");
    return 0;
}
cs


malloc을 이용했을때의 결과



메모리 할당만 이루어지고 생성자는 불리지 않음을 알 수 있습니다.
또한 malloc의 반환타입이 void* 이므로 Position* 타입으로 명시적 형변환을 해주어야합니다.





1-2) new, delete를 이용했을때.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
 
class Position
{
public:
    Position()    //생성자
    {
        cout << "2) new에 의해 생성자 호출됨" << endl;
    }
    ~Position() //소멸자
    {
        cout << "3) delete에 의해 소멸자 호출됨" << endl;
    }
};
 
//C++ 스타일의 동적할당과 해제 (new와 delete)
int main()
{
    //Position* ptr = (Position*)malloc(sizeof(Position));
    Position* ptr = new Position();
    cout << "1) malloc - 메모리 할당 끝 : 생성자는 불렸나?" << endl;
    delete(ptr);        //메모리해제.
    system("pause");
    return 0;
}
cs


new, delete 를 이용했을때의 결과



new를 이용했을때 메모리를 할당해준 후에, 생성자가 불리는 것을 알 수 있고, 타입을 바꾸어서 반환해주므로 명시적으로 형변환을 해주지 않아도 되는 것을 알 수 있습니다.


또한, delete에서 소멸자를 불러주고 메모리를 해제하는 것을 알 수 있습니다.




4. 결론


malloc, free 와 new,delete는 하는일이 다르니 같다고 생각하시면 안됩니다.

다시한번! 강조하면

new메모리할당, 생성자호출, 타입변환해서 반환

delete소멸자호출, 메모리해제


반응형