728x90
SMALL
new와 malloc의 차이점
new 의 경우 객체를 동적으로 생성하면서 동시에 자동으로 생성자를 호출하는 특징이 있다.
예시코드
Marine* marines[100]; marines[0] = new Marine(2, 3); marines[1] = new Marine(3, 5); marines[0]->show_status(); marines[1]->show_status(); //그외 다양한 행동 후 delete marines[0]; delete marines[1];
- new 연산자를 통한 메모리 할당이 실패할 경우는 예외가 발생하여 프로그램이 즉시 종료된다.
소멸자(Destructor)
우리가 생성했던 객체가 소멸될 때 자동으로 생기는 소멸자.
생성자 : Marine() 소멸자 : ~Marine()
객체 내부 생성자에서 동적으로 할당해준 녀석은 직접 해제해주지 않으면 메모리 누수가 발생한다.
메모리 누수를 방지하기 위해서 자동으로 호출하는 기능을 가진 것
특징
- 소멸자는 객체가 소멸될 때 자동으로 사용된다.
- 소멸자는 인자를 가지지 않는다. (따라서 오버로딩이 필요없다.)
- 스레드사이에 lock 된것을 푸는 역활을 한다
~Marine();
Marine::~Marine()
{
std::cout << name << " 의 소멸자 호출 ! " << std::endl;
if (name != NULL)
{
delete[] name;
}
}
복사 생성자
인자로 받는 변수의 내용을 변경할 게 아니라면 const를 붙혀 주는 게 바람직하다.
복사생성자의 표준적인 정의 모습
Photon_Cannon(const Photon_Cannon& pc);
T(const T& a);
클래스명 (const 클래스명 & 레퍼런스명)
복사생성자 사용예시
중요 !!!Photon_Cannon pc1(3, 3); Photon_Cannon pc2(pc1);//명시적으로 사용 Photon_Cannon pc3 = pc2; //암시적 사용
Photon_Cannon pc3; pc3 = pc2;
이 코드는 위의 복사생성자 사용코드와 엄연히 다른 코드이다.
복사 생성자는 오직 '생성' 시에 호출된다!!! !!!!!!!
디폴트 복사 생성자
C++ 컴파일러는 디폴트 복사 생성자(Default copy constructor)를 지원한다.이전의 디폴트 생성자와 소멸자처럼 하는게 없었다.
하지만 디폴트 복사생성자는 실제로 복사를 해준다.
즉 대응되는 원소들을 말 그대로 1 대 1 복사한다.
디폴트 복사생성자의 한계
- 포인터를 복사하는 경우 2개의 포인터가 같은 주소값을 가리키고 있어서 이중 free의 위험이 존재한다.( 이미 해제된 메모리에 접근하는 것은 금지된다!)
- 디폴트 복사생성자는 얕은 복사 밖에 하지 못한다
- 즉 깊은 복사가 필요한 경우 우리는 복사생성자를 직접 만들어줘야만 한다.
깊은복사 - 얕은복사
- 얕은복사 : 단순히 대입만 해줘서 같은 주소값을 가지고 있는 복사
- 다른 메모리에 동적할당을 해서 내용만 복사하는 것
참고링크
Uploaded by
N2T728x90
BIG
'CPP' 카테고리의 다른 글
[cpp 개념공부]연산자 오버로딩 (사용자 지정 연산자, 대입연산자, 입출력 오버로딩 ,첨자 연산자 Wrapper class) (1) | 2023.02.06 |
---|---|
[c++개념정리]암시적 변환, explicit, mutable (0) | 2023.01.27 |
[c++개념공부]함수 오버로딩, 생성자, default (0) | 2023.01.27 |
[c++개념공부]참조자와 이름공간 (0) | 2023.01.27 |
[c++개념공부]동적할당과 class (0) | 2023.01.27 |