티스토리 뷰

728x90

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

동적할당 연산자 new, delete를 사용 할 때 형태를 일치 시켜야한다.

사용법

int* pnCount =  new int; 
delete pnCount;

int* pArryCount = new int[100];
delete [] pArryCount;

 

예제 1


std::string *pStringArray = new std::string[100];
delete pStringArray;

위 코드와 같이 사용하면 pStringArray가 가리키는 100개의 string 객체들 가운데
99개는 정상적인 소멸 과정을 거치지 못합니다.

new를 사용하여 동적 메모리가 할당을 시도하게 되면 그 과정에서 std::string()의 생성자는 할 당 된 수 만큼 호출되면서 메모리에 할당 됩니다.
하짐만 일반적인 포인터 삭제 키워드인 delete만 사용하여 삭제를 하게되면 첫 4byte에 할당되어 있는 객체의 소멸자만 호출되고 뒤에 99개의 포인터는 메모리 상에 그대로 존재 하게 됩니다. Memory Leak이 발생됩니다. 
또한 std::string::buf 또한 정상적인 소멸을 이룰 수 없어 저장되어 있는 값 만큼 Memory Leak이 발생 됩니다.

 

예제 2

std::string *stringPtr1 = new std::string;
delete stringPtr1; // 객체 한 개를 삭제

std::string *stringPtr2 = new std::string[100];
delete [] stringPtr2; // 객체의 배열을 삭제

만약 delete [] stringPtr1를 한다면 앞쪽의 메모리 몇 바이트를 읽고 이것을 배열 크기로 해석
배열 크기에 해당하는 횟수만큼 소멸자를 호출,
자신이 밟고 있는 메모리가 배열에 속해 있지도 않다는 사실은 물론, 그 메모리에는 자신이 소멸시키려는 타입의 객체가 이미 들어있지 않다는 사실에 도달

 

 

결론

new에 []를 썼으면 대응되는 delete에도 []를 쓰면 됨

typedef std::string AddressLines[4];   // 주소는 네 줄로 되어있고 각각은 string
std::string *pa1 = new AddressLines; // "new AddressLines"는 string*을 반환
delete pa1; // 무슨일이 생길지 모름
delete [] pa1; // 깔끔 마무리

배열 타입은 typedef로 만들지 않는 것이 좋다.
string 혹은 vector 같은 좋은 클래스 템플릿이 존재하기 때문이다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
250x250