new & delete
길이정보를 인자로 받아, 문자열 저장이 가능한 배열을 생성하고, 그 배열의 주소 값을 반환하는 정의
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
char* makestradr(int len)
{
char* str = (char*)malloc(sizeof(char) * len); // 문자열 저장을 위한 배열을 힙 영역에 할당하고 있다.
return str;
}
int main(void)
{
char* str = makestradr(20);
strcpy(str, "I am so happy");
cout << str << endl;
free(str);
return 0;
}
위 예제는 C언어에서의 동적할당. 그러나 이 방법에는 다음의 두 가지의 불편함이 있다.
- 할당할 대상의 정보를 부조건 바이트 크기단위로 전달
- 반환형이 void형 포인터이기 때문에 적절한 형 변환
C++에서 제공하는 키워드 new와 delete를 사용하면 이러한 불편한 점이 사라진다.
malloc → new
free → delete
키워드 new의 사용법
- int형 변수의 할당 → int * ptr1 = new int;
- double형 변수의 할당 → double * ptr2 = new double;
- 길이가 3인 int형 배열의 할당 → int * arr = new int[3];
- 길이가 7인 double형 배열의 할당 → double * arr2 = new double[7];
키워드 delete의 사용법
- 할당한 int형 변수의 소멸 → delete ptr1;
- 할당한 double형 변수의 소멸 → delete ptr2;
- 할당한 int형 배열의 소멸 → delete []arr1;
- 할당한 double형 배열의 소멸 → delete []arr2;
예제
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
char* makestradr(int len)
{
//char* str = (char*)malloc(sizeof(char) * len);
char* str = new char[len];
return str;
}
int main(void)
{
char* str = makestradr(20);
strcpy(str, "I am so happy");
cout << str << endl;
//free(str);
delete []str;
return 0;
}
객체의 생성에서는 반드시 new & delete
기존의 malloc가 free 함수의 호출이 어떻게 문제가 될 수 있는지 간단히 언급
#include <iostream>
#include <stdlib.h>
using namespace std;
class Simple
{
public:
Simple()
{
cout << "Constructor" << endl;
}
};
int main(void)
{
cout << "case 1: ";
Simple* sp1 = new Simple;
cout << "case 2: ";
Simple* sp2 = (Simple*)malloc(sizeof(Simple) * 1);
cout << endl << "end of main" << endl;
delete sp1;
free(sp2);
return 0;
}
단순히 보면 new로 할당된 변수에 대해서는 "Contructor"가 출력되는 반면, malloc으로 할당된 변수에 대해서는 출력되지 않았다.
"new와 malloc 함수의 동작방식에는 차이가 있다."
힙에 할당된 변수? 이제 포인터를 사용하지 않아도 접근할 수 있음.
new 연산자를 이용해서 할당된 메모리 공간에도 참조자의 선언이 가능할까?
C++에서는 new 연산자를 이용해서 할당된 메모리 공간도 변수로 간주하여, 참조자의 선언이 가능하도록 하고 있다.
따라서 다음 문장 가능
int * ptr = new int;
int &ref = *ptr // 힙 영역에 할당된 변수에 대한 참조자 선언
ref = 20;
cout << *ptr << endl; // 출력 결과 20
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
클래스의 기본(03-1) C++에서의 구조체 (0) | 2020.12.23 |
---|---|
C언어 기반의 C++ 2(02-6) C++에서 C언어의 표준함수 호출하기 (0) | 2020.12.23 |
C언어 기반의 C++ 2(02-4) 참조자(Reference)와 함수 (0) | 2020.12.22 |
C언어 기반의 C++ 2(02-3) 참조자(Reference)의 이해 (0) | 2020.12.21 |
C언어 기반의 C++ 2(02-2) 새로운 자료형 bool (0) | 2020.12.20 |