C++을 주 언어로 몇년을 쓰다가

C#을 사용하려니 제일 귀찮고 힘든게

포인터가 없다는 것...


null check 만큼 값 체크 편한것도 없는데..

pointer가 없으니 곤란하다 ㅠ

구조체같은 nullable이 아닌 것들에 대한것은 값복사가 된다는 것도 그렇고.


STL도 없을 뿐더러

비슷하게 제공하는 List나 Dictionary의 경우도 역시 포인터는 안되는 듯.


그러면 쓸때마다 값복사가 일어나는 모양인데;;


구조체를 많이 쓰는데 굉장히 불합리한 느낌이다.


함수포인터 처럼 쓰는 delegate는 있으면서..ㅠㅠ


검색을 좀 더 해봐야겠다 ㅠㅠ

'Programming' 카테고리의 다른 글

About "Expert Beginner"  (0) 2018.10.04
좋은 프로그램의 척도  (0) 2018.01.31
javascript / normalizeForIE  (0) 2017.12.27
Linux 버전 확인 명령어  (0) 2016.10.14
기술자 등급분류 기준  (0) 2016.02.11


찾기 및 바꾸기에 사용하는 정규식에서.


ex.

\)\]\.Text = {[^"]*[:Ha][^"]*} ? \"√\" \: \"\";

정규식에서 사용하는 문자는 이스케이프 문자(\)를 붙여서 표현.

[^"]*[:Ha][^"]*

- 한글을 포함한 모든 문자 ; {}로 감싸서 태그로 사용

출처 : http://blogs.msdn.com/b/vcblog/archive/2009/03/28/some-vs2005-and-vs2008-wizards-pop-up-script-error.aspx

Please follow the following steps:

: 다음을 따라하세요.

-          Open regedit (on a 64-bit OS, open the 32-bit regedit)

: 레지스트리 에디터를 여세요 (OS에 상관없이 regedit을 여시면 됩니다) 
 cf. 윈도우키 + R 하면 실행창이 열려요

-          Under “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet 
Settings\Zones”, create a new key called 1000 (if it isn't already there)

: 해당 경로에 새로운 키("1000")를 만드세요 (만약에 없다면 말이죠)
 

-          Under 1000, create a DWORD entry with:

o   Name = 1207

o   Type = REG_DWORD

o   Data = 0x000000

: 새로 만든 키("1000") 안에 DWORD 엔트리(값)를 만드세요

(이름은 1207, 타입은 REG_DWORD, 데이터는 0x000000 으로요.)

 cf. 근데 DWORD 타입으로 만들면 타입이나 데이터는 초기화 된 상태가 보통 REG_DWORD, 0x00 이에요




해결!
원인은 IE8.0 이라고 합니다..;ㅁ;

덧.
시스템 재부팅을 할 필요는 없지만, 비주얼 스튜디오는 재시작 해주셔야 적용됩니다.





'Programming > API/MFC' 카테고리의 다른 글

WM_CHAR / WM_KEYDOWN  (0) 2013.06.07



WM_KEYDOWN 이 발생하면

WM_KEYDOWN 메시지 알림처리가 되고

key가 만약 char에 해당될 경우

WM_CHAR 를 발생시킴


즉, WM_CHAR 에 대한 처리를 하려면

WM_KEYDOWN을 무시하고 진행해야함

(그렇지 않으면 WM_KEYDOWN, WM_CHAR 두 번 다 걸림..)


WM_KEYDOWN 은 단순히 키가 눌림/안눌림만 판단하기 때문에

자판으로 구분하고 대소문자의 구분이 없음


WM_CHAR 는 입력된 문자에 대한 처리이기 때문에

대소문자의 구분이 있으며 자체적으로 갱신 메시지를 발생시킴



    _ASSERTE(pHead->nBlockUse == nBlockUse); 




     warning C4005: macro redefinition;



의 상관관계 -_-



* 그림이 저작권 때문에 문제가 된다면 내리겠습니다 ㅜㅜ






매크로 재정의 경고..... 아예 무시했었다.

내 경우, 매크로 재정의가 어쩔수 없었던게

한 솔루션 안에 만들어진 프로젝트가 많았는데(한 7개정도?)

그 중에는 API(혹은 단순 C++)도 있었고 MFC도 있었다.


그런데 C++ 쪽에서 릭 체크를 하기 위해

#ifdef _DEBUG
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif


이런 코드를 써놨었다.

이 헤더는 필수라 다른 프로젝트에서도 사용하고 있었고..


그런데 MFC에서 자체적으로

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


이렇게 써있는게 충돌이 난거다.


그래서 경고가 떴지만, 경고므로, 무시하고 진행했었다.

(심지어 프로젝트 속성에서 아예 경고 무시 설정해놔서 목록에도 안뜨게 해놨었다)

- 왜냐하면, MFC 쪽에 재정의된 부분을 주석처리하면, 에러로 돌변하고(매개변수가 안맞다며),

그걸 맞춰서 사용하면, 어느샌가 IMPLEMENT_DYNCREATE(, ) 부분을 사용할 수 없게 되버리기 때문에...ㅜㅜ


그런데, MFC쪽에서 C++ 클래스를 구현하고 new할당한 후 delete 하는 시점에서 뻑이 나는거다 ㅠㅠ

(프로그램 종료시)


저 위에 있는 Assertion Failed!


근데 아무리 봐도 문법을 위반한 데는 없었고..

추적도 안되는 부분이라

(추적하자면...dbgheap 파일에서 뻑나는데... 이걸 내가 해독할 수 있는것도 아니고...)


계속 검색을 하며 끙끙댔는데


사람들이 말하는 주 원인은

1. 메모리 해제를 중복했을때

2. 메모리 영역과 다른 영역을 해제했을때(영역침범)


이라는데 문제는 짐작가는게 전혀 없다는 거였다.


내가(그리고 많은 사람들이) Safe_Delete라고 지칭하는 

if(p) {
    delete p;
    p = NULL;
}


이 부분을 사용하기 때문에 1번 문제는 날래야 날 수가 없었던 ㅜㅜ


그리고..........


GPG 포럼에서


메모리 오버런일 확률도 있습니다. 

new, delete 시에 힙영역에서 몇가지 정보들을 이용하고 바꿉니다. 

만약 다른 버그로 인해서 그 메모리를 덮어씌우면 

엉뚱하게 new나 delete 에서 에러날수 있습니다. 

이때 new, delete 쪽만 뚫어져라보면 절대 잡을수 없습니다. 

다른 부분을 봐야합니다.


이런 얘기도 보고.


http://blog.naver.com/jaejun0201/50147724453


이런 얘기도 보고.


http://blog.naver.com/smanooo/140087357806


이런 얘기도 보고..하면서


갑자기 문득 떠오르는게 바로 new 재정의였다.


특히 마지막 블로그!


내부적으로 선언된 new 매크로나 할당/해제에 관한글을 세부적으로 풀어 써 주셨는데

그걸 보고 하면서 감이 어느정도 오기 시작했다.

혹시..혹시...호옥시........................


혹시가 사람 잡는거 맞네요.


MFC쪽 프로젝트에서

#ifdef new
#undef new
#endif


이 소스를 stdafx.h에 포함시켜주니


워닝도 전혀 뜨지않고


끌때 뻑도 안나더이다 ㅇㄱㄴ




전혀 짐작도 못했던 원인과 해결.

그리고 저 undef < 부분은 반은 짐작으로 ㅋㅋ

이렇게 하면 이전 매크로 해제되지 않을까 싶어서 해봤는데 되는거..


어쨌거나 해결! 어렵다 어려워.







'Programming > C/C++' 카테고리의 다른 글

S C++ :: MS의 매직 디버깅 숫자들의 의미  (0) 2013.03.07
memset()  (0) 2013.03.07

"Incremental Linker의 작동이 중지되었습니다."


라는 안내창이 뜨면서 꽤 높은 확률로 링크 에러가 발생할 때,

구글링 하면 대부분 SP1을 설치하라고 권고한다.


하지만.... Direct SDK 를 사용해서 그런지 어쩐지는 잘 모르겠지만,

vs2008 과 vs2008 sp1은 어느 부분(어딘지 모르겠지만)에서 호환이 안된다.

즉, sp1에서 작성한 솔루션을 그냥 vs2008에서 컴파일 했을 때 에러가 발생했었던 걸로 기억.


덕분에 sp1 에서 다운그레이드 하느라고 vs2008을 삭제하고 재설치하기까지 했다 ㅜㅜ

(주변 개발 환경이 vs2008이기 때문에 데스크탑을 맞출 수 밖에 없었다는...)


쨌든, 그러한 이유로 sp1 설치는 해결책이 되지 않아 이리저리 검색한 결과,

핫픽스를 설치하라는 글을 발견하고 기쁜 마음에 다운받아 설치하려고 했으나.


실행 직후 안내문에


"이 소프트웨어 업데이트가 적용되는 제품이 이 컴퓨터에 설치되어 있지 않습니다. 설치를 끝내려면 취소를 클릭하십시오."


ㅇㄱㄴ

또다시 좌절..


꽤 오랜 시간 검색한 결과 드디어..!!!

해결책을 찾았다!


에러가 나던 프로젝트 하나만 설정해주면 되는데,

해당 프로젝트의 속성(Alt+F7) - 구성 속성 - 링커 - 일반 - 증분 링크 사용

이 부분을 "예(/INCREMENTAL)" 에서

기본값 or "아니오(/INCREMENTAL:NO)"로 설정해주면 된다.


내 경우엔 "기본값"으로 설정했는데 이상없이 아주 잘된다!


오예 ~ㅁ~



ABABABABHeapAlloc으로 메모리 할당 후 가드 바이트에 채워진 값
CCCCCCCC초기화 되지 않은 스택 메모리
CDCDCDCD메모리 할당 후 초기화 되지 않은 힙 메모리
BAADF00DLocalAlloc(LMEM_FIXED)으로 메모리 할당된 후 초기화 되지 않은 값
FDFDFDFD할당된 메모리의 전후 가드용 바이트에 채워지는 값
FEEEFEEE힙 메모리를 해제한 후 채워지는 값


출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&page=3&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=101

'Programming > C/C++' 카테고리의 다른 글

헐... 매크로 재정의 경고!! 무시하지 말자 ㅠㅠ  (0) 2013.05.07
memset()  (0) 2013.03.07


memset() 함수의 구조.


void* memset(void* _p, int _value, size_t _n);


void* _p : 메모리의 크기를 변경할 포인터

int _value : 세팅할 값

size_t _n : 초기화 길이(크기)


return void* : void* _p에 대한 포인터를 반환, 실패시 NULL 리턴


* memset() 함수로 int형 변수(를 담은 포인터)를 초기화 하는 경우 : _value는 0만 가능.

정확히는 다른 수들도 에러는 나지 않지만 예상치 못한 값으로 세팅됨. 자리의 세팅이 아닌듯.

확신할 수는 없고... 1로 세팅해서 16진수로 토해내게 했더니 0101 0101 이라고 출력됨. why?


* memset() 함수로 char형 변수(를 담은 포인터)를 초기화 하는 경우 : _value에 들어온 값을 아스키로 인식.

+ Recent posts