반응형
변수의 메모리를 new를 통해 동적 할당하는 경우 데이터는 힙 영역에 저장됨
- 힙에 저장된 데이터는 프로그램이 끝날때까지 유지되기 때문에 더이상 사용하지 않는 경우 반드시 delete로 해제시켜주어야 함
- 힙에 할당하는 것은 비교적 속도가 느리고, 포인터를 역참조하여 변수의 값에 접근하는 것 역시 직접 접근하는 것보다는 느림
일반적으로 변수를 선언할 경우 정적 할당되어 데이터는 스택 영역에 저장됨
- 스택 영역에 저장된 데이터는 해당 변수가 지정된 범위(scope)를 벗어날시 자동으로 해제 및 소멸
- 스택에 할당하는 것은 비교적 속도가 빠르지만, 스택 자체의 크기가 비교적 작으므로 유의해야함
#include <iostream>
int main()
{
//1바이트 만큼 heap 할당
char *ptr = new char;
*ptr = 'a';
std::cout << "메모리 주소 : " << (void *)ptr << "\\t 값 : " << *ptr << "\\n";
std::cout << "heap의 크기 : " << sizeof(*ptr) << std::endl;
//4바이트 만큼 heap에 할당
int *ptr1 = new int;
*ptr1 = 3;
std::cout << "메모리 주소 : " << ptr1 << "\\t 값 : " << *ptr1 << "\\n";
std::cout << "heap의 크기 : " << sizeof(*ptr1) << std::endl;
//4바이트 만큼 heap에 할당
float *pfloat = new float;
*pfloat = 3.14;
std::cout << "메모리 주소 : " << pfloat << "\\t 값 : " << *pfloat << "\\n";
std::cout << "heap의 크기 : " << sizeof(*pfloat) << std::endl;
//8바이트 만큼 heap에 할당
double *pdouble = {new double};
*pdouble = 3.141592;
std::cout << "메모리 주소 : " << (void *)pdouble << "\\t 값 : " << *pdouble << "\\n";
std::cout << "heap의 크기 : " << sizeof(*pdouble) << std::endl;
delete pdouble;
delete ptr;
delete ptr1;
delete pfloat;
}
결과
메모리 주소 : 0x7f9452c05880 값 : a
heap의 크기 : 1
메모리 주소 : 0x7f9452c05890 값 : 3
heap의 크기 : 4
메모리 주소 : 0x7f9452c058a0 값 : 3.14
heap의 크기 : 4
메모리 주소 : 0x7f9452c05950 값 : 3.14159
heap의 크기 : 8
→ char에 void* 형 변환 이유?
char 배열이 문자열이기 때문에 문자열의 시작주소를 가리키는 char * 출력 → std::cout 자체에 문자열을 보여주도록 기능 구현이 되어있기 때문
new는 함수가 아니라 연산자!!
new와 배열
#include <iostream>
int main()
{
int num = 3;
double *ptr = new double[num];
for (int i = 0; i < 3; i++)
{
ptr[i] = i + 1.1;
std::cout << "ptr[" << i << "] : " << ptr[i] << "\\n";
}
delete []ptr;
}
→ 동적으로 할당된 배열임!! 동적 배열아님
동적 배열?
- 말그대로 배열의 길이가 동적으로 늘었다 줄었다 하는 거임. 이건 배열의 크기를 정해 heap 공간에다가 배열을 할당하는 것임.
배열 해제시 == delete[] 사용
- delete만 사용할 경우 첫 번째 원소에 해당하는 메모리만 해제됨 그 뒤 메모리는 해지 안 됨.
그 외에 new를 하면서 초기화, malloc을 실패시 bad_alloc, 초기화 리스트 등
클래스 할당
#include <iostream>
class A
{
private:
int a;
public:
A(int a) : a(a)
{
}
int getA()
{
return a;
}
};
int main()
{
A *tmp = new A(2);
std::cout << tmp->getA() << std::endl;
delete tmp;
}
결과
./a.out
2
반응형
'C++ > C++ 동적 할당, 객체 포인터 할당, 레퍼런스' 카테고리의 다른 글
객체 포인터 배열 할당 (1) | 2023.12.01 |
---|---|
레퍼런스와 포인터 (0) | 2023.11.30 |