[C++]malloc & free를 대신하는 new&delete

4221 단어 윤성우CC

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

좋은 웹페이지 즐겨찾기