new/delete 사용 방법
하나 할당 할때 VS 여러개 할당 할 때
[ ] 배열로 선언을 했으면 delete할때도 " delete[] 이름 "으로 지워줘야됨.
그에 따른 메모리 할당 사이즈
( 하나 할당 할때 VS 여러개 할당 할 때 ) 에 할당되는 메모리차이
코드
더보기
// C:\Users\wonhy\Desktop\hansung_study\inflearn_C++\섹션 7.동적 할당
#include<iostream>
using namespace std;
class Monster
{
public:
int _hp=0;
int _x=0;
int _y=0;
};
int main()
{
//======================================================================================================================
//기존의 molloc free 형식
void* p_3 = malloc(sizeof(Monster)); //size는 12byte , 변수하나당 4
Monster* m2 = (Monster*)p_3;
m2->_hp = 1;
m2->_x = 2;
m2->_y = 3;
free(p_3);
//======================================================================================================================
//======================================================================================================================
//기본 new delete 형식 , ㅗ이게 아쉬운 점 Monster하나사이즈만 할당
Monster* m11 = new Monster;
m11->_hp = 1;
m11->_x = 2;
m11->_y = 3;
delete m11;
//new[] delete[] : Monster사이즈를 여러개 할당 할때 쓰는 방법
Monster* m22 = new Monster[5];
m22->_hp = 1;
m22->_x = 2;
m22->_y = 3;
delete[] m22;
// m33에 m22[1]을 넣어서 사용 가능
Monster* m33 = (m22 + 1);
m33->_hp = 1;
m33->_x = 2;
m33->_y = 3;
delete m33;
return 0;
}
new/delete VS malloc/free 차이점
// malloc/free VS new/delete
// - 사용 편의성 -> new/delete 승 !
// - 타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면 ? - malloc/free 승!
// 그런데 둘의 가장 가장 근본적인 중요한 차이는?
// 1. malloc/free는 함수고 new/delete는 연산자이다.
// 2. new/delete는 (생성타입이 클래스일 경우) 생성자/소멸자를 호출해준다.!!
일단 이 코드는 에러나는 코드다. TEST용 코드니까 확인만.
에러나는 이유 m22를 소멸시켰는데 m22를 할당하는 m33이 있고 또 그거를 m33으로 소멸시키려니까 에러나는 것.
코드
더보기
// C:\Users\wonhy\Desktop\hansung_study\inflearn_C++\섹션 7.동적 할당
#include<iostream>
using namespace std;
// 오늘의 주제 : 동적할당
/*
메모리 구조 복습
- 실행할 코드가 저장되는 영역 -> 코드 영역
- 전역(global)/정적(static) 변수 -> 데이터영역
- 지역변수/매개변수 -> 스택영역
- 동적 할당 -> 힙영역
지금까진 데이터영역/스택영역을 이용해서 프로그램구성함
but 새로운영역 heap은 왜 필요한걸까
ex)
이유 1.
- MMORPG에서 동접 1~5만명 , 몬스터 1마라~500만마리
이럴 때 5만명 500만마리 의 변수data들을 stack에 전부 저장할 경우
스택 오버플로우가 발생함. 몬스터가 1마리일 수 도 100마리 일 경우가 있잖아
이유 2.
- 스택 영역
함수가 끝나면 같이 정리되는 불안정한 메모리
잠시 함수에 매개변수를 넘긴다던가 하는 용도로 사용됨
- 메모리 영역 (데이터)
프로그램이 실행되는 도중에는 '무조건' 사용되는 영역
3. 결론
따라서 이런 경우 필요시 되는 메모리란?)
(1)- 필요할때만 메모리에 할당하고, 필요없으면 메모리에서 제거할 수 있고
(2)- 스택과 다르게 우리가 메모리에 생성(할당)/소멸 시점을 관리 할 수 도 있고
(1)과 (2)에 해당되는 메모리가 바로 Heap영역
heap영역(동적)에 할당하는 문법은 : (malloc , free) , new , delete , new[] , delete[]
*/
// new[] / delete[]
// - new가 malloc에 비해 좋긴 한데 - 배열과 같이 N개 데이터를 같이 할당 하려면?
// malloc/free VS new/delete
// - 사용 편의성 -> new/delete 승 !
// - 타입에 상관없이 특정한 크기의 메모리 영역을 할당 받으려면 ? - malloc/free 승!
// 그런데 둘의 가장 가장 근본적인 중요한 차이는?
// 1. malloc/free는 함수고 new/delete는 연산자이다.
// 2. new/delete는 (생성타입이 클래스일 경우) 생성자/소멸자를 호출해준다.!!
class Monster
{
public:
Monster()
{
cout << "Monster()" << endl;
}
~Monster()
{
cout << "~Monster()" << endl;
}
public:
int _hp=0;
int _x=0;
int _y=0;
};
int main()
{
//======================================================================================================================
//기존의 molloc free 형식
void* p_3 = malloc(sizeof(Monster)); //size는 12byte , 변수하나당 4
Monster* m2 = (Monster*)p_3;
m2->_hp = 1;
m2->_x = 2;
m2->_y = 3;
free(p_3);
//======================================================================================================================
//======================================================================================================================
//기본 new delete 형식 , ㅗ이게 아쉬운 점 Monster하나사이즈만 할당
Monster* m11 = new Monster;
m11->_hp = 1;
m11->_x = 2;
m11->_y = 3;
delete m11;
//new[] delete[] : Monster사이즈를 여러개 할당 할때 쓰는 방법
Monster* m22 = new Monster[5];
m22->_hp = 1;
m22->_x = 2;
m22->_y = 3;
delete[] m22;
// m33에 m22[1]을 넣어서 사용 가능9
Monster* m33 = (m22 + 1);
m33->_hp = 1;
m33->_x = 2;
m33->_y = 3;
delete m33;
return 0;
}
'C++,python (인프런+사이트) > C++ 동적 할당' 카테고리의 다른 글
타입변환_1_2 (0) | 2022.03.08 |
---|---|
동적할당_1_2_(malloc_free) (0) | 2022.02.02 |
댓글