성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
[간단한 팁] C++ 클래스 멤버변수 초기화 클래스 하나를 만드는데, 필연적으로 그 클래스에는 멤버 변수들이 많아지게 되는 경우가 있습니다. 게다가 프로그램 하다보면, 기존 변 수가 필요없어질 때가 있고, 예상치 않게 또 추가되는 경우도 있습니 다. 어쨌든 멤버 변수들이 초기화도 안되어 있는 상태라면 좀 그럴 것 같 아서, 대개의 경우 아래와 같이 생성자에서 초기화를 해줍니다. MyClass::MyClass() { m_nM1 = 0; m_nM2 = 0; m_nM3 = 0; m_nM4 = 0; } 대강 위와 같은 식으로 초기화를 해주었는데요. 그런데, 문득 간단한 방법이 생각나더군요. MyClass::MyClass() { ZeroMemory( this, sizeof( MyClass ) ); } 물론, 안의 멤버변수들을 모아서 구조체 하나 만들고 구조체를 한번 에 초기화해주면 되겠지만, 그렇게 되면 멤버함수들에서 일일이 구조 체 이름도 쫓아가주어야 하니까요. 에고,,, 다들 아시는 거였나요? ^^ 그런데, 위와 같이 해주어서는 안됩니다. 그렇게 해주니 자꾸만 "엑세스 위반" 위반 에러가 나는 경우를 접하 게 되었습니다. 왜 그랬을 까요? 자, 여기서 잠깐 생각해 보시고요. 답을 알고 싶으실 땐, 스크롤을 아 래로 쭉 내려주세요. ZeroMemory( ((char *)this) + 4, sizeof( MyClass ) - 4 ); 이렇게 해주어야 합니다. 안그러면, vtable 포인터까지 모조리 초기화 를 해버리기 때문입니다. ^^ 하지만, 한가지 더 고려를 해야 될 것 이 있습니다. 위의 초기화를 생성자에서 해주면 안되는 경우가 있는데요. 예를 들어, class CMyBase { RECT *m_pTemp; CMyBase() { m_pTemp = new RECT; } ~CMyBase() { delete m_pTemp; } }; class CMyDerived { CMyBase temp; CMyDerived() { ZeroMemory( ... ); } ~CMyDerived() {} }; 위에서와 같이 자신이 가지고 있는 멤버변수가 동적할당을 생성자에 서 하고 있으면 ZeroMemory(...) 초기화를 해서는 안됩니다. 왜냐면, 이미 CMyDerived 생성자의 "{" 블록으로 진입하기 이전에 CMyBase temp 변수는 생성될 것이고, 그 순간 CMyBase::m_pTemp 는 동 적메모리 할당을 받을 것입니다. 그런 와중에, 다음에 ZeroMemory 를 해버리게 되어서 CMyBase::m_pTemp 도 NULL 로 되어 버리는 것이죠. 에이... 그냥 속편하게 멤버변수 일일이 초기화 하는 것이... ^^ ------- 한창 따분한 프로젝트 하다가... --------
첨부파일
스팸 방지용 인증 번호
2081
(왼쪽의 숫자를 입력해야 합니다.)