본문으로 바로가기

[C++]new 와 delete, 그리고 C++의 헤더파일

category 프로그래밍/C++ 2017. 4. 17. 01:49
반응형

안녕하세요. 바로 접니다. letitkang입니다.


오랜만에 글쓰네요... 제가 이렇습니다 ㅠㅠ


본론으로 들어가서 오늘은 new, delete 그리고 C++에서 C언어의 함수 호출법을 알아보겠습니다.


'윤성우의  C++ 열혈강의'를 보고 공부합니다!


 

 

 



1. new함수? delete는 뭐야?


동적할당 아시죠? 모르시면 안됩니다.


동적할당, 즉 Heap영역은 필수중의 필수입니다!


잘 모르시면 C언어의 동적할당을 정독하시기 바랍니다!


C언어에서 동적할당 하면 malloc와 free 함수를 떠오르게 됩니다.


C언어에 비유하자면 malloc -> new, free -> delete 입니다.


C언어에서는 동적할당에 특징이 2가지 있습니다.


1. 메모리를 할당할 대상의 정보들은 무조건 바이트 단위이다.

2. 반환형이 void형이기 때문에 형변환을 해야된다.


이렇기 때문에 불편한점이 많았습니다.


그러나 C++은 C에 플러스 플러스 된것입니다!!!


C++에서는 위의 두가지가 사라집니다.


밑의 예제를 한번 살펴보겠습니다. new로 동적할당을 하는 예제입니다.


===============================================================================================


int형 변수의 할당                            int * ptr1 = new int;

double형 변수의 할당                      double * ptr2 = new double;

길이가 3인 int형 배열의 할당            int * arr1 = new int[3];

길이가 7인 double형 배열의 할당      double * arr2 = new double[7]


===============================================================================================


위의 문장을 읽어보면 됩니다. 쉽다고 생각합니다.


다음은 delete로 메모리를 해제하는 예제를 살펴보겠습니다.


===============================================================================================


앞서 할당한  int형 변수의 소멸         delete ptr1;

앞서 할당한 double형 변수의 소멸    delete ptr2;

앞서 할당한 int형 배열의 소멸          delete [ ]arr1;

앞서 할당한 double형 배열의 소멸    delete [ ]arr2;


===============================================================================================


메모리 소멸 시키는 것도 간단합니다.


C++의 동적할당에 대한 소스를 살펴 보겠습니다.


 

 

 



===============================================================================================

동적할당에 대한 소스 코드 예제

===============================================================================================

 

 1 #include <iostream>

  2 #include <string.h>

  3

  4 using namespace std;

  5

  6 char * MakeStr(int len)

  7 {

  8     // char* str=(char*)malloc(sizeof(char)*len);

  9     char * str = new char[len];

 10     return str;

 11 }

 12

 13 int main(void)

 14 {

 15     char * str = MakeStr(20);

 16     strcpy(str, "New Delete!!!");

 17     cout<<str<<endl;

 18     // free(str);

 19     delete []str;

 20     return 0;

 21 }


===============================================================================================

결과

===============================================================================================

New Delete!!!

===============================================================================================


위의 예제는 한줄 한줄 살펴보시면 이해가 되실겁니다.


C++에서는 malloc와 free를 호출할 경우, 문제가 될 수도 있습니다.


그러므로 new, delete를 사용해야됩니다.


또한 뒤에서 나오는 객체를 생성하기 위해서는 new와 delete를 사용해야됩니다.


그 이유는 new와 malloc의 동적할당 방법이 다르기 때문입니다.


객체는 new로 생성을 해야됩니다. malloc로 생성하게 된다면, 동작 안하는 부분이 있습니다.


2. 동적할당 된 변수는 포인터를 사용하지 않아도 접근할 수 있다!


이전에 배웠던 참조자 선언은 변수를 대상으로 가능합니다.


그렇다면 new로 할당된 메모리 공간에도 참조자로 가능할까요?


물론 가능합니다.


===============================================================================================

int*ptr = new int;

int &ref = *ptr;

ref = 20;

cout<<*ptr<<endl;

===============================================================================================


참조자의 선언을 통해서 힙영역에 접근할 수 있습니다.


2. C++에서 C언어 표준함수 호출하기


먼저 헤더파일을 한번 보겠습니다.


c언어의 헤더파일을 쓰고, 표준 함수를 호출하면 됩니다.


===============================================================================================

#include <stdio.h>          -> #include <cstdio>

#include <stdlib.h>         -> #include <cstdlib>

#include <math.h>         -> #include <cmath>

#include <string.h>         -> #include <cstring>

===============================================================================================


위의 예제만 보더라도 특징이 있는것을 알 수 있습니다.


헤더파일의 c를 더하고 .h를 빼면됩니다!


헤더파일을 선언하고, 헤더파일에 있는 표준 함수를 사용하시면됩니다.


그리고 한가지 말씀 드리겠습니다.


C++에서는 C++ 헤더를 선언해야 됩니다.


왜냐하면 '하위버전의 호환성'을 제공하기 위해서입니다.


또한 C++함수는 오버로딩이 되어 있기 때문에, C언어 헤더파일을 사용하면 문제가 생깁니다.


 

 



오늘의 포스팅은 여기까지입니다.


내일 부터 또 월요일이네요!


다들 열심히 공부해서 부자됩니다!


읽어주셔서 감사합니다.

반응형

'프로그래밍 > C++' 카테고리의 다른 글

[C++]C++의 용어 정의와 파일 분할  (0) 2017.06.16
[C++]C++의 구조체와 Class  (0) 2017.04.20
[C++]new 와 delete, 그리고 C++의 헤더파일  (0) 2017.04.17
[C++]참조자(reference) 3  (0) 2017.04.11
[C++]참조자(reference) 2  (0) 2017.04.09
[C++]참조자(reference) 1  (0) 2017.04.04

댓글을 달아 주세요