언어/C++

[Effective C++] new 및 delete를 사용할 때는 형태를 반드시 맞추자

2020. 1. 16. 19:18
반응형

항목 16 : new 및 delete를 사용할 때는 형태를 반드시 맞추자

 

아래에 적어 놓은 것에서 뭔가 잘못된 점이 보이나요?

 

1
2
3
std::string *stringArray = new std::string[100];
...
delete stringArray;
 

 

아무런 문제가 없어 보이지만, 100개의 string 객체 가운데 99개는 정상적인 소멸과정을 거치지 못할 가능성이 큽니다.

여러분이 new 연산자를 사용해서 표현식을 꾸미게 되면, 이로 인해 두 가지의 내부 동작이 진행됩니다. 일단 메모리가 할당됩니다. 그 다음, 할당된 메모리에 대해 한 개 이상의 생성자가 호출됩니다. delete 표현식을 쓸 경우에는 또 다른 두 가지의 내부 동작이 진행되는데, 우선 기존에 할당된 메모리에 대해 한 개 이상의 소멸자가 호출되고, 그 후에 그 메모리가 해제됩니다.

 

어떤 포인터에 대해 delete를 적용할 때, delete 연산자로 하여금 '배열 크기 정보가 있다'라는 정보를 알려 주어야만, delete가 '포인터가 배열을 가리키고 있구나'라고 가정하게 됩니다. 그렇지 않으면 그냥 단일 객체라고 간주하고 맙니다.

 

1
2
3
4
5
std::string *stringPtr1 = new std::string;
std::string *stringPtr2 = new std::string[100];
...
delete stringPtr1;                                    // 객체 한 개를 삭제합니다.
delete [] stringPtr2;                                 // 객체의 배열을 삭제합니다.
 

 

우리가 잊지 말아야 할 것은 new 표현식과 delete 표현식의 형태를 똑같이 맞추는 것 입니다.

이 규칙은 typedef 타입도 해당합니다.

 

1
typedef std::string AddressLines[4];        // 주소는 네 줄로 되어 있고, 각각은 string입니다.
 

 

AddressLines는 보다시피 배열입니다. 따라서 아래처럼 new를 사용하면,

 

1
std::string *pal = new AddressLines;                // "new AddressLines"는 string*을 반환한다는 점을 잊으면 안됩니다. "new string[4]"이거든요.
 

 

delete 역시 배열 형태가 되어야 문단속이 제대로 됩니다.

 

1
2
delete pal;                // 정상적인 소멸 과정이 이루어지지 않을 수 있습니다.
delete [] pal;            // 깔끔하게 종료됩니다.
 

 

머리 속이 심난해지지 않으려면, 배열 타입을 typedef 타입으로 만들지 않는 것이 좋습니다. 표준 C++ 라이브러리에는 string이라든지 vector 같은 좋은 클래스 템플릿이 있어서, 잘 활용하면 동적 할당 배열이 필요해질 경우가 거의 없기 때문입니다. 위의 예제도 vector<string>타입으로 만들면 됩니다.

 

꼭 잊지 말아야 할 것!

new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 합니다. 마찬가지로 new 표현식에 []를 안 썼으면, 대응되는 delete 표현식에도 []를 쓰지 말아야 합니다.

반응형

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

[Effective C++] 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자  (0) 2020.01.18
[Effective C++] new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자  (0) 2020.01.17
[Effective C++] 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자  (0) 2020.01.15
[Effective C++] 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자  (0) 2020.01.14
[Effective C++] 자원 관리에는 객체가 그만!  (0) 2020.01.13
'언어/C++' 카테고리의 다른 글
  • [Effective C++] 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자
  • [Effective C++] new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자
  • [Effective C++] 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자
  • [Effective C++] 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자
지나가던 개발자
지나가던 개발자
지나가던 개발자
나의 발전을 위한 공간
지나가던 개발자
전체
오늘
어제
  • 분류 전체보기 (221)
    • 언어 (86)
      • C++ (43)
      • JAVA (43)
    • 게임 개발 (4)
      • 간단한 RPG 게임 만들기 (4)
      • 게임 개발 이슈 해결 (0)
    • 백준 문제풀이 (36)
      • PLATINUM (0)
      • GOLD (13)
      • SILVER (21)
      • BRONZE (2)
    • 프로그래머스 문제풀이 (32)
      • LEVEL 5 (0)
      • LEVEL 4 (0)
      • LEVEL 3 (7)
      • LEVEL 2 (19)
      • LEVEL 1 (6)
    • SQL 문제풀이 (15)
      • 프로그래머스 (4)
      • 해커랭크 (11)
    • 디자인 패턴 (1)
    • 웹 (17)
      • 웹 이론 정리 (17)
    • CS 지식 (28)
      • 알고리즘 (0)
      • 데이터베이스 (11)
      • 자료구조 (0)
      • 네트워크 (7)
      • 그래픽스 (0)
      • 운영체제 (9)
      • 기타 (1)
    • Git (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 깃 허브

공지사항

인기 글

태그

  • 해커랭크
  • Chapter 6
  • mysql
  • Chapter 4
  • BOJ
  • 객체 지향 설계
  • 클래스와 인터페이스
  • 설계 및 선언
  • level 1
  • 객체 생성과 파괴
  • 백준
  • 상속
  • Gold 5
  • 열거 타입과 애너테이션
  • java
  • 프로그래머스
  • c++
  • 소멸자 및 대입 연산자
  • Silver 3
  • Level 2

최근 댓글

최근 글

hELLO · Designed By 정상우.
지나가던 개발자
[Effective C++] new 및 delete를 사용할 때는 형태를 반드시 맞추자
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.