공부/C++

[C++] 2-5. new & delete

knhoo 2024. 9. 15. 15:57
728x90

*윤성우의 열혈 C++ 프로그래밍 교재로 학습하며 정리하였습니다.

 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string.h>//C++에서 C언어의 헤더 파일을 추가하는 것도 가능하다.
#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언어에서의 malloc을 이용한 동적할당에는 두가지 불편사항이 있다.

 

1. 할당할 대상의 정보를 무조건 바이트 크기 단위로 전달해야 한다.

2. 반환형이 void 포인터이기 때문에 적절한 형 변환을 거쳐야 한다.

 

C++에서는 newdelete를 사용하여 이러한 불편한 점을 해소할 수 있다.

 

new

int *ptr1 = new int;//int형 변수의 할당
double *ptr2 = new double;//double형 변수의 할당
int * arr1 = new int[3];//길이가 3인 int형 배열의 할당
double*arr2 = new double[7];//길이가 7인 double형 배열의 할당

 

키워드 new오른쪽에 할당할 대상의 정보를 직접 명시한다.

 

delete

delete prt1;//앞서 할당한 int형 변수의 소멸
delete ptr2;//앞서 할당한 double형 변수의 소멸
delete []arr1;//앞서 할당한 int형 배열의 소멸
delete []arr2;//앞서 할당한 double형 배열의 소멸

new 연산 시 반환된 주소 값을 대상으로 delete 연산을 진행하되,

할당된 영역이 배열의 구조라면 [ ]를 추가로 명시해준다.

 

예제

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string.h>
using namespace std;

char* MakeStrAdr(int len) {
	//char* str = (char*)malloc(sizeof(char) * len);
	char* str = new char[len];//malloc대신 new를 사용
	return str;
}

int main(void) {
	char* str = MakeStrAdr(20);
	strcpy(str, "I am so happy!!");
	cout << str << endl;
	//free(str);
	delete[]str;//배열의 형태로 할당된 메모리 공간의 해제
	return 0;
}

#include <iostream>
#include <stdlib.h>
using namespace std;

class Simple {
public:
	Simple() {
		cout << "I'm simple constructor!" << endl;
	}
};

int main(void) {
	cout << "case 1: ";
	Simple* sp1 = new Simple;
	//new 연산자를 이용해서 힙 영역에 변수 할당

	cout << "case 2: ";
	Simple* sp2 = (Simple*)malloc(sizeof(Simple) * 1);
	//malloc 함수 호출을 통해서 힙 영역에 변수 할당
	cout << endl << "end of main" << endl;
	delete sp1;//new를 사용한 할당에 대한 소멸
	free(sp2);//malloc을 사용한 할당에 대한 소멸
	return 0;
	//new와 malloc함수의 동작 방식에는 차이가 있다.
}

위 예제의 실행 결과를 보면 malloc을 사용한 변수 할당 방식으로는 문자열이 출력되지 않는다.

즉 new와 malloc 함수의 동작 방식에는 차이가 있다.

객체의 생성


포인터 없이 힙에 할당된 변수에 접근하기

참조자의 선언은 상수가 아닌 변수를 대상으로만 가능하다.(const 제외)

그렇다면 new 연산자를 이용해서 할당된 메모리 공간에도 참조자의 선언이 가능할까?

C++에서는 new 연산자를 이용해서 할당된 메모리 공간도 변수로 간주하여 참조자의 선언이 가능하다.

int* ptr = new int;
int &ref = *ptr;//힙 영역에 할당된 변수에 대한 참조자 선언
ref = 20;
cout<<*ptr<<endl; //20

C언어에서는 힙 영역에 할당된 변수에 접근하려면 포인터를 사용해야만 했다.

위 코드에서 볼 수 있듯이, 참조자를 통해 포인터 연산 없이 힙 영역에 접근할 수 있다는 것을 알 수 있다.

 

 

728x90