2019. 9. 15. 05:08
728x90

erase를 사용할 때는 erase로 반환되는 iterator를 변수에 대입해야 합니다.
erase(it)를 했다고 it가 자동으로 갱신되는게 아니라 it = erase(it)로 대입을 해줘야 합니다.
erase를 할 경우 iterator 변수는 empty 상태로 변경되기 때문입니다.

Visual Studio에서는 조사식으로 확인할 때 이 iterator의 값이 empty로 표기되지 않고 
삭제한 결과에 맞게 자동으로 갱신된 것처럼 표기됩니다.


erase를 하기 전의 상태
it는 nums[1]을 가리키고 있는 상태이며, 조사식에도 it의 [ptr]이 &nums[1]과 같은 것을 볼 수 있습니다.



erase를 하고 난 후의 상태
it도 갱신되고 [ptr]도 &nums[1]의 것과 동일한 것으로 출력됩니다.


하지만 막상 iterator 변수를 참조하려고 하는 순간 런타임 에러가 발생합니다.


Leetcode 문제를 풀다 iterator 사용법을 헷갈려하여 잠시 헤맸던 상황이었고
혹시 저와 같은 문제로 고생 중인 분이 있을 수도 있기에 포스팅으로 남깁니다.


for (auto it = nums.begin() + 1; it != nums.end();)
{
	if (*it == *(it - 1))
	{
		nums.erase(it);		// 이러면 it 참조 시 에러 발생
		it = nums.erase(it);	// it를 계속 사용할 거라면 이렇게.
	}
	else
	{
		it++;
	}
}
728x90
Posted by 아야카
2019. 2. 17. 15:29
728x90

<요약>

전처리문
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

누수 확인
_CrtDumpMemoryLeaks();

할당 지점 브레이크
_crtBreakAlloc = 할당번호;

메모리 상태 체크
_CrtMemState 구조체에 담기
_CrtMemCheckpoint(&구조체변수이름); 으로 체크


전처리문으로 다음 내용을 추가한다.
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>

메모리 누수를 확인할 시점에 아래 함수를 작성한다.
_CrtDumpMemoryLeaks();

_CrtDumpMemoryLeaks()은 메모리 누수가 있는 경우 1을 리턴, 없을 경우 0을 리턴한다.
메모리 누수에 대한 상세한 정보는 디버그 창에서 확인할 수 있다.

{166}은 메모리 할당 번호
at 뒤에 있는 0x0007A828은 메모리 주소
16 bytes long은 누수된 메모리 크기
Data: 뒤에 있는 내용은 메모리 내용이다.

_CrtDumpMemoryLeaks()가 실행되는 시점에 메모리 누수 여부를 체크한다.
프로그램 전체에 대해 확인하고 싶다면 프로그램이 종료되는 부분에 작성해두도록 한다.

누수가 발생하는 메모리 할당 번호에서 디버깅 중단점이 발생하기 원한다면 해당 메모리의 할당시점보다 이전 시점에 아래 내용을 작성해두면 된다.
_crtBreakAlloc = 메모리 할당 번호;
그러면 아래와 같이 메모리 할당 번호에 해당하는 지점에서 브레이크 포인트가 걸린다.


메모리 누수가 얼마나 일어나는가에 대해 콘솔에서 확인을 해보고 싶은 경우에는 _CrtMemState 구조체를 이용해보는 것도 방법일 수 있다.
_CrtMemState는 다음과 같이 구성되어 있다.

#define _MAX_BLOCKS      5
typedef struct _CrtMemState
{
    struct _CrtMemBlockHeader* pBlockHeader;
    size_t lCounts[_MAX_BLOCKS];
    size_t lSizes[_MAX_BLOCKS];
    size_t lHighWaterCount;
    size_t lTotalCount;
} _CrtMemState;

메모리 상태를 체크할 시점에
_CrtMemCheckpoint(&구조체 변수 이름) 함수를 사용하면 해당 시점의 메모리 정보가 구조체에 입력된다.

이를 통해 특정 시점 전 후의 상태를 기록하여 이 둘을 비교하면 메모리 누수가 어느정도 발생했는지 파악할 수 있다.
구조체 구성 중 lCounts는 메모리에 할당된 변수의 개수, lSizes는 메모리에 할당된 용량의 크기를 나타낸다.


참고 자료: https://docs.microsoft.com/ko-kr/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2017

728x90
Posted by 아야카
2019. 1. 21. 03:15
728x90

POCU에서 input redirection 설정에 대해 언급이 됐었는데 실제 적용이 어떻게 되는가에 대해서는 언급이 되지 않는 것 같아
직접 알아보고 파악한 부분에 대해 블로그 포스팅으로 남긴다.


<설정>
1. 프로젝트 속성 -> 디버깅 에 들어간다.
2. 명령 인수에 입력으로 쓸 파일 이름을 입력한다. (빨간 박스 친 부분)
3. 빌드하여 디버깅 모드로 실행하면 명령 인수에 입력한 파일에 입출력이 진행된다.


<예시>
테스트용 코드

int main()
{
	string text;
	string trash;
	while(cin.eof() == false)
	{
		cin >> text;
		if (cin.fail() == true)
		{
			cin.clear();
			cin >> trash;
		}
		else
		{
			cout << text << endl;
		}
	}
	return 0;
}


입력파일 샘플

이 상태에서 디버깅을 실행하면 입력이 필요한 부분은 모두 test.txt 파일 내용을 읽는 것으로 대체된다.



출력 인수를 설정하지 않은 경우

cout으로 출력하는 상황이므로 콘솔창에 모두 출력된다.


출력 인수를 text.txt로 설정한 경우

이렇게 text.txt라는 파일에 출력하게 된다.
이 때 콘솔창에는 아무런 내용도 출력되지 않는다.

728x90

'공부 > C++' 카테고리의 다른 글

Visual Studio와 erase 함수  (0) 2019.09.15
Visual Studio에서 CRT 라이브러리로 C++ 메모리 누수 검사  (0) 2019.02.17
Posted by 아야카