[C++]malloc & free를 대신하는 new&delete
new & delete
길이정보를 인자로 받아서 해당 길이의 문자열 저장이 가능한 배열을 생성하고, 그 배열의 주소 값을 반환하는 함수를 보자 !
#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형 포인터이기 때문에 적절한 형 변환을 거쳐야 한다.
malloc -> new
free -> delete 이다! 씨플플에서는 말이다.
이를 기반으로 다음 예제를 보자.
#include <iostream>
#include <string.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 를 배웠으니 C++ 에선 malloc,free함수를 호출하는 일이 없어야 한다!
이는 문제가 될 수 도 있기에 꼭 기억하자 !!
객체의 생성에서는 반드시 new&delte
그렇다!!!
클래스에 들어가고 더 자세히 배우자 !
힙에 할당된 변수? 이제 포인터를 사용하지 않아도 접근할 수 있어요.
비록, 흔히 사용되는 문장은 아니지만, 참조자의 선언을 통해서, 포인터 연산 없이 힙 영역에 접근했다는 사실에는 주목할 필요가 있다!!
문제 02-3
구조체에 대한 복습을 겸할 수 있는 문제를 보자.
2차원 평면상에서의 좌표를 표현할 수 있는 구조체를 다음과 같이 정의하였다.
typedef strct__Point
{
int xpos;
int ypos;
}Point;
위의 구조체를 기반으로 두 점의 합을 계산하는 함수를 다음의 형태로 정의하고
Point& PnTAdder(const Point &p1, const Point &p2);
임의의 두 점을 선언하여, 위 함수를 이용한 덧셈연산을 진행하는 main 함수를 정의해보자.
(단, 구조체 Point관련 변수의 선언은 무조건 New연산자를 이용해서 진행해야 하며, 할당된 메모리공간의 소멸도 철저해야한다. 참고로 이 문제의 해결을 위해서는 다음 두 가지 질문에 답할 수 있어야한다.
- 동적할당 한 변수를 함수의 참조형 매개변수의 인자로 어떻게 전달해야하는가?
- 함수 내에 선언된 변수를 참조형으로 반환하려면 해당 변수는 어떻게 선언해야 하는가?
정답
#include <iostream>
#include <string.h>
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=5;
pptr2->ypos=50;
Point &pref=PntAdder(*pptr1, *pptr2);
cout<<"["<<pref.xpos<<", "<<pref.ypos<<"]"<<endl;
delete pptr1;
delete pptr2;
delete &pref;
return 0;
}
Author And Source
이 문제에 관하여([C++]malloc & free를 대신하는 new&delete), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seochan99/Cmalloc-free를-대신하는-newdelete저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)