메모리 관리하는 법 3가지
1. 메모리 풀
한번에 많이 잡아놓고, 필요한만큼 쓰다가 한번에 삭제하는 방식.
2. 매니저
매니저가 메모리를 잡아주고, 빌려가는 형식으로 만드는 방식.
이 방식이 젤 많이 쓰이는 것 같다.
3. 스마트포인터
알아서 해주는 방식.
일반 포인터보다 조금 느리기 때문에, 연산 속도가 필요하다면 일반 포인터를 쓰는 게 낫다.
c++ 장점은 메모리 관리니까 일반 포인터를 쓰는 게 좋을 듯 하다.
메모리 누수잡기
메모리 누수를 고의로 내고, 컴파일했다.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h> // 메모리 할당 및 할당 해제를 추적하는 함수들이 정의되어 있음.
#include <iostream>
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
int* p1{};
int* p2{};
int* p3{};
int* p4{};
int* p5{};
p1 = new int{};
p2 = new int[3]{};
p3 = new int[2]{};
p4 = new int{};
p5 = new int{};
delete p1;
//delete[] p2; // 메모리 누수
delete[] p3;
//delete p4; // 메모리 누수
delete p5;
}
할당된 메모리 중에 번호 78번과 76번에서 메모리 릭이 발생한다고 나온다.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(76); // 추가
int* p1{};
int* p2{};
int* p3{};
int* p4{};
int* p5{};
p1 = new int{};
p2 = new int[3]{};
p3 = new int[2]{};
p4 = new int{};
p5 = new int{};
delete p1;
//delete[] p2;
delete[] p3;
//delete p4;
delete p5;
}
메모리 번호 76번에서 메모리가 할당되는 시점에 중단해준다.
이렇게 메모리 누수를 잡을 수 있다.
'기타 > C++' 카테고리의 다른 글
[C++] 클래스 간의 조립 (상속, 포함) (0) | 2020.12.29 |
---|---|
[C++] 복사 생성자에 대해서 (2) | 2020.12.24 |
[C++] 참조자 (reference), 포인터와의 차이 (0) | 2020.12.23 |
[C++] 동적 할당과 메모리 해제 (0) | 2020.12.17 |
[C++] 클래스 생성자에 대해서 (0) | 2020.08.16 |