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