최상단 광고

2012년 4월 16일 월요일

[C++강좌] - 2-6. new&delete

우왕 쿧! ㅋ;; 
드디어 2단원의 마지막이네요...

더욱 수고해 주시길 바랍니다!!
2단원으로써 C와 C++을 비교하는 챕터가 끝날 뿐이니까요 하핫!

*이 강좌는 C언어를 끝냈다는 가정하에 실시합니다.

┌───────────────┐
---앞으로의 목차---
2-6. new&delete
3-1. 구조체? 클래스?
3-2. 객체에 대하여
└───────────────┘

<지난 강좌를 살펴보고 와주세요 !! : http://blog.naver.com/owndks98o/120156814599 >

2-6. new&delete
안녕하세요!!
드디어 2단원의 마지막이라 그런지 저도 설레고 떨립니다 하핫;;

이번시간에는 malloc과 free를 C++에 어울리게 기능을 추가한 new와 delete에 대해 알아봅시다.
먼저 malloc과 free를 훑어보고 지나갈까요?

/*
malloc.cpp
*/
#include
using namespace std;

int main(){
const int size=16; //이정도 할당해 봅시다.

int* dat=(int*)malloc(sizeof(int)*size);

free(dat);
return 0;
}
이 정도 예제는 바로 이해할수 있을 것이라 생각합니다.

그럼 이 예제를 그대로 c++의 new와 delete 형식으로 바꿔보죠.
훨씬 간단해진 것을 볼수 있을 것입니다.

/*
new.cpp
*/
#include
using namespace std;

int main(){
cont int size=16;

int* dat=new int[size];
delete[] dat;
return 0;
}
훨씬 간단해진 것이 보이시나요?
소스의 붉은 부분을 보시면,
new 타입[...]
처럼 되있는 부분을 보실수 있으실겁니다.
이부분에서 타입형 데이터 ...개를 할당합니다.

만약 한개만을 할당하고 싶다면,
new 타입
으로 끝내실수 있습니다.

그리고 new의 거대한 장점!!
malloc은 void포인터를 리턴하기 때문에 강제형변환을 해주어야 했지만 new는 할필요가 없습니다.
int면 int* char이면 char*로 알아서 리턴해 주기 때문이죠.

그럼 이젠 반환해 봅시다.
delete[] 메모리;
처럼 되어있는 부분이 보이시나요?

이 부분에서 메모리를 반환하게 됩니다.

역시 한개만을 반환하고 싶다면,
delete 메모리;
로 끝내실수 있습니다.

그럼 만약 한가지 가정을 해봅시다. 만약 동적할당이 제대로 되지 않았다면?
으아아악 거리면서 프로그램이 종료되버리면 되는걸까요? <퍽퍽 죄송합니다;;

이런 상황을 대비하기 위하여 new는 동적할당이 되지 않았을 경우를 대비하여 안됬을때 NULL을 리턴합니다.
아래와 같은 소스를 짜보면 되는 것이죠.

/*
NULL.cpp
*/
#include
using namespace std;

int main(){
const int size=16;

int *dat=new int[size];
if(dat==NULL){
//종료전처리
return -1;
}

delete[] dat;
return 0;
}
간단하죠?

하지만 이러한 코드는 일반적으로 보았을때에 NULL이 리턴되는 경우가 잘 없으므로, 성능의 저하를 불러온다고 생각하시는 분들이 많이 있습니다. 따라서, 이러한 코드는 DEBUG 시에서만 작성하는 것도 하나의 방법이 될수 있습니다.
new&delete의 응용은 class를 배우면서 해보도록 합시다!

Tip.사실 new와 delete는 class관련해서 중요한 기능을 가지고 있습니다. 그건 다음 단원에서 알아봅시다 하핫!

댓글 없음: