[C++] 포인터, delete

Learning 

When: 1학년 11월 16일

 

How: 

C++를 배우는데, 포인터 개념이 나오면서부터 C#에서 공부한 내용과 C++의 개념이 충돌하여 헷갈렸기 때문에 복습하게 되었습니다.

 

Understanding:

  • 간단 설명: 포인터는 번역하면 '가리키는 것'입니다. 무엇을 가리킨다는 걸까요? 바로 객체입니다.
    정확히 말하면 객체의 주소를 저장하여 생성된 객체의 위치를 알 수 있게 해주는 형식입니다.
    C#에서는 클래스 객체는 힙에 생성되어 그 객체를 담는 변수가 주소를 값으로 가지는데,
    C++은 클래스나 구조체나 힙 또는 스택에 자유자재로 할당할 수 있기 때문에, 같은 타입의 객체를 담는 변수여도
    포인터인지, 일반 변수인지를 구별해야 합니다. 그래서 포인터는 형식을 지정할 때,
    타입의 오른쪽에 * 기호를 추가합니다. int* pointer; 이런 식으로 말이죠. 그럼, 이 변수는 포인터가 됩니다.
    정확히는 int형 객체의 주소를 가리키는 포인터입니다. 참고로 포인터는 객체의 주소를
    값으로 가지는 변수이기에 힙에 있는 객체의 주소를 가지는 C#의 참조 형식 변수와는 다릅니다.
    포인터는 스택에 저장된 객체도 가리킬 수 있습니다.
  • 특징: C#의 참조 형식 변수와 거의 똑같기 때문에 제대로 배웠다면 포인터를 복사하면 객체가 아닌
    주소가 복사되어 복사 비용이 적어지지만, 같은 객체를 2개의 변수가 가리키고 있기 때문에
    원치 않는 변환이 이루어질 수 있다는 점이나 런타임에 크기가 결정된다는 사실을 알 수 있습니다.
  • delete: C#에서나 C++에서나 스택에 할당되는 객체는 코드 블록이 끝나면 자동으로 사라지기
    에 크게 신경 쓸 필요가 없습니다. 하지만 힙에 할당되는 객체는 코드 블록이 끝나도 사라지지 않습니다.
    코드 블록이 끝나면 그 객체를 가리키는 변수는 사라질지라도 실제로 객체는 남아있는데,
    이 객체의 위치를 알던 유일한 변수가 사라지면, 이제 이 객체는 존재하지만 아무도 찾을 수 없는
    버뮤다 삼각지대로 들어가 버린 셈입니다. 그럼, 메모리 어딘가에서 자리만 차지하고 있는 가비지 객체가 되고,
    이는 메모리 누수로 이어집니다. 이를 해결하기 위해 C#은 이런 가비지 객체를 알아서
    검사하고 삭제해 주는 가비지 컬렉터를 통해 메모리 누수를 막아주는데,
    객체를 하나하나 검사하기 때문에 비용이 큰 편입니다. C++은 속도를 중요시하기 때문에
    이런 가비지 컬렉터는 사치이고, 프로그래머가 delete 키워드로 직접 메모리를 해제하기를 요구합니다.
    delete pointer; pointer = nullptr; 이렇게 객체를 지우고 포인터가 더 이상 사라진 객체를 가리키지 않게 
    하기 위해 nullptr을 할당해주면 객체의 삭제가 끝납니다. 무서운 점은 new 키워드로 힙에 객체를 생성하고
    삭제하는 것을 잊어버릴 때마다 메모리 누수가 점점 심해집니다. 이 사실을 배웠을 때 자신도 모르게 만든
    메모리 누수가 점점 쌓여서 나중에 게임이 정상 작동하지 못하게 됐을 때를 상상하니 불안감이 몰려와
    C++이 참 무서운 언어임을 느꼈습니다.

 

Result: 포인터 자체는 C#의 참조와 거의 똑같기 때문에 많이 어렵지 않았는데, delete를 직접 해줘야 하고, 하지 않으면 메모리 누수가 발생한다는 사실이 지금까지 C++을 공부하며 배운 내용 중 가장 무서운 내용이었습니다.

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

[C++] 입력과 출력  (0) 2025.11.14
[C++] signed, unsigned 키워드, 2의 보수  (0) 2025.11.13
[C++] class와 struct (C# 하던 사람 관점)  (0) 2025.11.10
[C++] 전처리 지시문(Preprocessor directives)  (0) 2025.11.09
[C++] 빌드 (Build)  (0) 2025.11.08