study/C++

malloc & free를 대체하는 new & delete

IT공부 2020. 5. 20. 00:13
반응형

 

길이 정보를 인자로 받아서, 해당 길이의 문자열 저장이 가능한 배열을 생성하고, 그 배열의 주소 값을 반환하는 함수 정의

#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;
}

실행결과

I am so happy

 

"C언어에서의 동적 할당의 불편사항"

 

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

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

 

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];

 

- int형 변수 소멸                        delete ptr1;

- double형 변수의 소멸               delete ptr2;

- int형 배열의 소멸                     delete [] arr1;

- double형 배열의 소멸               delete [] arr2;

 

 

NewDelete.cpp

#include<iostream>
#include<cstring>
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;
}

실행결과 

I am so happy~

 

"객체의 생성에서는 반드시 new & delete"

NewObject.cpp

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

class Simple
{
	public:
		Simple()
		{
			cout<<"I am simple 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;
	
}

실행결과

case 1: I am simple constructor!

case 2:

end of main

 

"힙에 할당된 변수를 참조자를 이용하여 접근"

 

int *ptr = new int;

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

ref=20;

cout<<*ptr<<endl; //출력 결과 20

 

 

[구조체에 대한 new & delete 연산]

#include<iostream>
using namespace std;

typedef struct __Point 
{
	int xpos;
	int ypos;
} Point;

Point& PntAdder(const Point  &p1, const Point &p2)
{
	Point *pptr= new Point;
	pptr->xpos=p1.xpos+p2.xpos;
	pptr->ypos=p1.ypos+p2.ypos;
	return *pptr;
	
}

int main(void)
{
	Point *pptr1=new Point;
	pptr1->xpos=3;
	pptr1->ypos=30;
	
	Point * pptr2=new Point;
	pptr2->xpos=70;
	pptr2->ypos=7;
	
	Point &pref=PntAdder(*pptr1, *pptr2);
	cout<<"["<<pref.xpos<<", "<<pref.ypos<<"]"<<endl;
}

'study > C++' 카테고리의 다른 글

C++ 정리  (0) 2020.10.22
예외처리 (try catch)  (0) 2020.06.30
참조자(Reference)  (0) 2020.05.19
자료형 bool  (0) 2020.05.19
이름공간(namespace)에 대한 소개  (0) 2020.05.19