C++/C++ 동적 할당, 객체 포인터 할당, 레퍼런스

C++의 동적할당

재윤 2023. 11. 30. 17:38
반응형

변수의 메모리를 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

 

 

반응형