CS
[c++] 클래스기반 객체 선언 방식 차이
Early_Birdy
2021. 7. 3. 20:39
728x90
Person me;
// 1. 일반적인 변수 선언방식
Person *me = new Person;
// 2. 동적할당 방식
1. 일반적인 변수 선언방식
이 방식은 해당 함수 내에서 잠깐 사용하고 자동으로 해제시키기 위해 사용되는 방식이다.
이때 저장되는 메모리는 스택이며 함수에서 벗어나게 되면 자동으로 메모리가 해제된다.
2. 동적할당 방식
이 방식은 프로그램이 프로세스로 돌아가는 동안 내내 메모리에 상주하게 되는데, 이때는 힙메모리에 저장된다.
힙 메모리에 상주하게되면 함수밖으로 나가게되거나 해도 직접 delete 해주지 않으면 계속 메모리를 잡고있기 때문에 메모리 누수가 날 수 있다.
동적할당 방식은 스마트포인터를 잘 활용하면 되는데 스마트포인터는 후에 자세하게 포스팅 할 예정.
메모리 차이 뿐만아니라 멤버변수, 함수 의 접근 방식에도 차이가 있다.
Person me;
cout << me.age << endl;
일반적인 선언방식으로는 . 으로 해당 멤버에 접근할 수 있는 반면에
Person *me = new Person;
cout << me->age << endl;
동적할당은 접근자를 -> 로 줘야 한다.
C와 비교하여 생성자 입장에서 바라보기
모든 객체는 선언, 초기화 시에 한번의 생성자 호출을 한다. ( 생성자가 없으면 디폴트 생성자가 호출되고.)
그러나 new가 아닌 동적할당 malloc 함수로 객체를 만들면 생성자는 호출되지 않는다!
Person *me = (Person*)malloc(sizeof(Person));
malloc 호출 시, Person 클래스의 크기정보만 바이트단위로 전달되어 생성자가 호출되지 않는다.
그래서 객체의 동적할당은 꼭 new 연산자를 사용해야한다.