티스토리 뷰
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
- PowerShell
- 패턴
- 블루버블다이빙팀
- 오블완
- CMake
- 블루버블
- C#
- C++
- 성산블루버블
- script
- 울릉도
- Windows
- C# 고급 기술
- 스쿠버다이빙
- 현포다이브
- Linux
- 스쿠버 다이빙
- DLL
- 서귀포블루버블
- 티스토리챌린지
- 제주도
- C
- 블루버블다이브팀
- 암호화
- C#.NET
- 서귀포
- OpenSource
- 외돌개
- 네트워크 정보
- Build
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |