CPP/씹어먹는 c++

[c++개념공부]복사 생성자 (깊은복사 얕은복사), 소멸자

뜨거운 개발자 2023. 1. 27. 19:25

 


💻

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의 위험이 존재한다.( 이미 해제된 메모리에 접근하는 것은 금지된다!)
    • 디폴트 복사생성자는 얕은 복사 밖에 하지 못한다
    • 즉 깊은 복사가 필요한 경우 우리는 복사생성자를 직접 만들어줘야만 한다.

    깊은복사 - 얕은복사

    • 얕은복사 : 단순히 대입만 해줘서 같은 주소값을 가지고 있는 복사
    • 다른 메모리에 동적할당을 해서 내용만 복사하는 것

     

참고링크

 
https://modoocode.com/188

 


Uploaded by

N2T
728x90