C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76064] Re:Re:Re: C++ 언어를 잘못 사용하고 있음
빌더(TWx) [builder] 1628 읽음    2021-02-25 10:53
뽀뽀중 님이 쓰신 글 :
: 빌더(TWx) 님이 쓰신 글 :
: : 뽀뽀중 님이 쓰신 글 :
: : : 안녕 하세요.
: : :
: : : 많은 양의 계산결과를 vector 와 구조체를 조합하여 메모리에 저장하는 방법을 사용하고 있습니다.
: : : new  같은 동적할당은 전혀 하지 않았습니다.
: : :
: : : 재계산을 할 경우에는 기존 vector 에 저장된 값을 초기화 하고 다시 입력을 합니다.
: : : 이렇게 하면, 메모리 사용량이 증가를 할수가 없는데, 윈도우작업관리자로 보면 메모리사용량이 증가 하고 있습니다.
: : :
: : : 이 부분을 보완해야 할것 같은데, 어느 vector 에서 사용량이 증가하는 지  확인 하는 방법이 있나요?
: : :
: : :
: : : 저장할 구조체
: : :
: : : struct TNE_RainDistCal { // 1차반복
: : :     AnsiString AsRainDistName; // 강우분포 이름
: : :     AnsiString AsRainDistSimbol; // 강우분포 기호
: : :
: : :     struct FreqRainDist FreqRainDistData;
: : :     vector<FreqRainDist>veFreqRainDist;
: : :
: : :     TNE_RainDistCal() {
: : :         Clear();
: : :     }
: : :
: : :     void Clear() {
: : :         AsRainDistName = "";
: : :         AsRainDistSimbol = "";
: : :
: : :         FreqRainDistData.Clear();
: : :         veFreqRainDist.clear();
: : :
: : :         ZeroMemory(this, sizeof(*this));
: : :     }
: : : };
: : :
: : : extern TNE_RainDistCal TNE_RainDistCalData;
: : : extern vector<TNE_RainDistCal>veRainDistCalResult;
: : :
: : : 이런식으로 구조체를 정하고,
: : : 초기화는 TNE_RainDistCalData.Clear();
: : : veRainDistCalResult.clear();
: : :
: : : 이런식으로 하였습니다.
: : :
: :
: :
: :
: : 답변:
: :
: :
: : vector도 잘못 사용하고 있고...
: : 전체 소스코드 구조를 보지 않고선 메모리 누수의 원인을 판단할 수 없어요.
: :
: : wdmdrv@outlook.kr 로 프로젝트 전체소스 압축해서 보내보세요.
: :
: : 버그를 진단하는 데에 어느 정도의 비용이 발생할 수도...
: :
: :
: :
: 안녕 하세요.
: 답변 감사 드립니다.
:
: 벡터에 문제가 있다는 의견에 따라, 벡터의 메모리 해제 관련 하여 검색을 해 보았더니,
: 메모리 해제 하는 방법에 문제가 있음을 알게 되었습니다.
: .clear() 한다고 벡터 메모리가 삭제되는것은 아니라는 것을 알게 되었습니다.
: 입력한 자료는 삭제되겠지만, 벡터가 확보한 메모리는 그대로 존재하는 것을 이해하게 되었습니다.
: http://blog.naver.com/lsm_origin/220056735792 글을 보고 알게 되었습니다.
:
: vector<TNE_RainDistCal>().swap(veRainDistCalResult);
: 와 같은 방법으로 모든 구조체를 초기화 하니, 메모리 증가 현상은 사라 졋습니다.
:
:
: 답변에  감사 드립니다.
:






답변:


vector<T>().swap(t);

구문에 의해서 벡터의 Allocator가 릴리즈 되는 효과를 얻을 수 있다는 것은
벡터 내부구조를 이해하는 데에 도움이 될 수 있는 것에 의미가 있을 뿐이지.
저런 효과가 있으니까 위 구문을 써야겠다고 생각했다면...
벡터를 이해하고 쓰고 있는 게 아니고 결과만 받아들이고 있는 겁니다.


벡터를 갖고있는 구조체를...

ZeroMemory(this, sizeof(*this)); 으로 초기화하고 있는 것을 보면

POD에 대한 개념도 없고


C++ 언어는 메모리 관리에 신경쓰지 않도록 RAII 패턴을 지원하고 있음에도 불구하고
활용하지 못하고 있고.


C++11에서 일어난 가장 큰 변화인 r-value 레퍼런스와 perfect forwarding 개념을
완전하게 마스터 하고 있지 못하면 C++11, 17, 20 그리고 C++26이 나온다고 하더라도
C++ 언어의 파워를 절대로 활용할 수 없게 됍니다. Boost 라이브러리를 확장해서 사용하는 것도 불가능 하고.

델파이 파스칼 언어는 옵티마이징을 위한 이런 개념 자체가 아예 없음. 초보자들이 사용하기 쉬운 언어에 불과.




벡터를...

vector<T>().swap(t);

저런 식으로 사용하는 건...
컴파일러만 C++ 사용하고 델파이 파스칼 언어처럼 코딩하는 것과 다를 바 없는 겁니다.


C++11 부터 벡터는 r-value 레퍼런스 move assignment 시멘틱 룰을 지원하는데
벡터를 왜 저런 식으로 사용합니까.








+ -

관련 글 리스트
76050 작업관리자의 메모리 사용량 증가 원인 확인 방법이 있나요? 뽀뽀중 1242 2021/02/16
76059     Re:작업관리자의 메모리 사용량 증가 원인 확인 방법이 있나요? 빌더(TWx) 1495 2021/02/21
76062         Re:Re:작업관리자의 메모리 사용량 증가 원인 확인 방법이 있나요? 뽀뽀중 1332 2021/02/23
76064             Re:Re:Re: C++ 언어를 잘못 사용하고 있음 빌더(TWx) 1628 2021/02/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.