티스토리 친구하기

본문 바로가기

Robotics/C++

C++ 객체생성 new, delete / 멤버 변수 초기화

728x90

객체생성

아래는 Number 클래스에 객체를 만드는 코드입니다.

 

class Number
{
  private:
    int n1;
    int n2;
};

int main()
{
  Number num1; // 스택(stack) 메모리에 만듬 (빠름)
  Number* num2 = new Number; // 힙(heap) 메모리에 만듬 (느림)
  
  num1.n1 = 10;
  num1.n2 = 20;
  
  num2->n1 = 30;
  num2->n2 = 40;
  
  std::cout << num1.n1 << num1.n2 << std::endl;
  std::cout << num2->n1 << num2->n2 << std::endl;
  
  delete num2;
}

 

num1 이라는 객체를 생성할 때는 stack에 메모리를 할당합니다.

int가 2개이니까 8byte가 사용됩니다.

 

new를 이용해서 num2 객체를 생성할 때는 stack과 heap을 사용합니다.

num2 pointer 주소값은 stack에 저장되고 4byte의 용량을 차지합니다. 

그리고 stack에 저장된 주소값은 heap을 가리키고, 가리키고 있는 곳에 int 2개의 용량인 8byte의 메모리를 할당합니다.

 

new로 객체를 생성했을 때는 반드시 delete를 이용해서 메모리를 해제해야 합니다.

main이 종료되면, 아래와 같이 stack에 저장되었던 메모리해 해제됩니다.

그러면 heap을 가리키고 있던 메모리도 해제되기 때문에, heap에 있는 메모리를 접근할 방법이 없어 메모리 해제가 불가능 합니다.

즉, 메모리 누수가 발생합니다.

그래서 new로 객체를 생성하면 반드시 delete를 이용해서 메모리를 해제해야 합니다.

 

 

객체 배열은 heap에 객체를 5개 만들어줍니다.

즉, 아래의 예제에서 heap에는 4byte * 2 * 5개로 40byte의 메모리가 할당됩니다.

메모리를 해제할 때는 반드시 "[]" 를 붙여야 합니다. 그렇지 않으면 배열이 아니라 하나인줄 알고 8byte만 해제됩니다.

 

class Number
{
  private:
    int n1;
    int n2;
};

int main()
{
  Number* num = new Number;
  Number* num_list = new Number[5]; 
  
  // 중략...
  
  delete num;
  num = NULL; // 안해줘도 되지만 누군가 num이 해제됐는지 모르고 사용하는 걸 방지하기 위함
  
  delete[] num_list; // [] 반드시 넣어야 함. 안 그러면 첫 번째꺼만 메모리 해제됨
  num_list = NULL; // 안해도 됨
}

멤버 변수 초기화

- C++에서 맴버 변수는 초기화되지 않음

- 이유는 성능 때문에

  - 자동으로 멤버 변수를 초기화하면 초기화하는데 시간이 걸림

  - C++은 사용자가 메모리를 관리하는 언어이기 때문에 위험하지만 알아서 초기화해주지 않음

- 메모리에는 이전에 메모리에 있던 값이 그대로 있음 

반응형

'Robotics > C++' 카테고리의 다른 글

C++ 생성자 (Constructor)  (0) 2022.12.05
C++ 접근 제어자 (Access Modifier) public / protected / private  (0) 2022.12.02
C++ 함수 오버로딩 (overloading)  (0) 2022.11.22
C++ Reference (참조)  (0) 2022.10.23