C++ 어두 운 면

5823 단어
다음으로 이동:http://www.kuqin.com/language/20110522/91699.html
최근 한 편의 < The Dark Side Of C++ > 가 시중 에 널리 퍼 졌 는데, C++ 를 밥 먹 는 녀석 으로 하 는 프로그래머 로 서 다운 받 아서 잘 읽 어야 한다.전체적으로 보면 정리 가 잘 되 어 있 습 니 다. 개인 지식의 제한 으로 인해 저 는 읽 은 후에 이 를 세 가지 로 나 누 었 습 니 다. 하 나 는 제 가 그렇게 생각 하지 않 고 어두 운 면 이 라 고 생각 하지 않 습 니 다.하 나 는 깊 은 공감 을 가지 고 그 피 해 를 많이 받는다.또 다른 하 나 는 아직 이해 하지 못 하고 앞으로 시간 이 있 을 때 연구 해 야 한 다 는 것 이다.
그렇다 고 생각 하지 않다
끊임없이 변 경 된 표준 때문에 우 리 는 기 존 코드 를 계속 업데이트 해 야 한다.저 자 는 몇 가 지 를 보 여 주 었 습 니 다.그리고 표준 적 인 진 보 를 위해 가끔 타협 하 는 것 도 당연 하 다.
끊임없이 변경 되 는 style, 작가 가 예 를 들 면:
 
    
Old and busted:
for (int i = 0; i < n; i++)
New hotness:
for (int i(0); i != n; ++i)

  이것 괜찮아요?두 번 째 방식 쓰 시 는 분 계 세 요? 
auto_ptr 썩 었 습 니 다.이것 은 당신 이 그것 을 사용 하지 않 으 면 됩 니 다. 그리고 최근 에 스마트 포인터 에 C++ 0 x 대가족 에 가입 한 후에 공감 대 를 형성 해 야 합 니 다 iterator 가 효력 을 잃 을 수 있 습 니 다.이것 은 나 는 괜 찮 은 것 같 아서 많은 문 제 를 만난 적 이 없다.
iterator 는 container 에 대해 전혀 모른다.이것 이 STL 디자인 의 장점 이 라 고 생각 합 니 다. iterator 디 결합 알고리즘 과 용 기 를 통 해.
vector::at 는 경계 검 사 를 하고 operator [] 는 그렇지 않 습 니 다.좋 습 니 다. 두 가지 선택 을 제공 합 니 다 구조 함수 와 석조 함수 중의 허 함수 호출 은 기본 클래스 의 허 함수, 심지어 순 허 함수 까지 호출 할 수 있 습 니 다.이것 은 그다지 어 둡 지 않 습 니까? 구조 함수 와 석조 함수 에서 항상 허 함 수 를 호출 하지 않 는 것 은 상식 일 것 입 니 다. 그리고 다른 언어 는 이런 문제 가 없 습 니까?
공감
템 플 릿 에 산 이 무 너 지고 바다 가 무 너 지 는 컴 파일 오류 가 있 습 니 다. 번 거 롭 기 짝 이 없 는 오류 뒤에 있 는 이 유 는 iterator 형식 만 잘못 사용 한 것 일 수 있 습 니 다.그 죽은 C++ 0x proposal 이 이 문 제 를 해결 할 수 있 을 지 모르겠다.
C++ 로 쓴 코드 는 읽 기 가 쉽 지 않 습 니 다. 함수 리 셋, 연산 자 리 셋, 가상 함수 리 셋, 유형 리 셋, 매크로 정의 등 코드 의 실제 모습 을 뒤에 엄 격 히 숨 겼 습 니 다.(물론 이것 도 추상 과 일치 성 을 위 한 것 이다) 몇 가지 예:
 
    
string a("blah"); //     string  
string a(); //      

a && b //   &&     ,     ;       ,          

typedef OtherType& Type;
Type a = b;
a.value = 23; //      typedef,   b        

 그리고 baz = foo->bar(3);이렇게 간단 한 줄 코드 뒤에 담 겨 있 는 무한 한 가능성 도 C + 코드 가 읽 기 어 려 운 특징 을 충분히 나 타 냈 다.
cin 이 왜 typecast 에서 void * 로 갔 는 지 에 대한 토론 은 C++ 중 검 이 편 파 적 인 상황 - 불 이 나 지 않 으 면 한 수 실수 로 자신 을 다치게 하기 쉽다 는 것 을 보 여 준다.
석조 함수 에서 이상 을 던 져 서 는 안 됩 니 다. 저 는 예전 에 한 가지 이유 만 알 고 있 었 습 니 다. - 바로 지난번 이상 스 택 전개 과정 에서 석조 함 수 를 호출 하고 이상 을 던 지면 프로그램 이 종 료 될 수 있 습 니 다.그러나 여기 서 제 가 더 설득력 이 있다 고 생각 하 는 이 유 를 제 시 했 습 니 다. delete [] 배열 을 할 때 앞의 대상 이 이상 을 분석 하여 배열 의 다른 대상 의 메모리 가 유출 될 수 있 습 니 다.
클래스 구성원 의 초기 화 순 서 는 목록 의 순 서 를 초기 화 하 는 것 이 아니 라 정 의 된 순서 로 결정 된다. - 이 점 은 확실히 큰 혼란 을 일 으 켰 고 많은 bug 를 가 져 왔 다. - C++ 의 행 위 는 반 직관 적 이기 때문이다.
함수 호출 에서 포인터 의 방식 은 이 함수 가 이 매개 변 수 를 바 꿀 수 있 음 을 뚜렷하게 알려 주 었 으 나 인용 은 이렇게 뚜렷 하지 않 았 습 니 다. 문법 은 전달 값 호출 과 같 지만 매개 변수 값 을 바 꿀 수 있 습 니 다.
C++ 너무 강하 고 유연 해서 많은 사람들 이 잘 통제 하지 못 합 니 다. - 복잡 한 feature set 이 너무 많 습 니 다. 잘 사용 하 세 요. 박 사 를 읽 으 셔 도 됩 니 다 ~ ~ prefix++ 의 리 셋 문법 은 operator + (yourtype &) 입 니 다. 구별 하기 위해 postfix 의 리 셋 문법 에는 dummy 의 int 인자 가 있 습 니 다. operator + (yourtype &, int dummy).나 도 더 좋 은 방법 은 없 지만 바보 라 는 것 을 인정한다.
같은 용 기 는 서로 다른 allocator 를 사용 하기 때문에 상호작용 을 할 수 없습니다. 이것 은 이해 할 수 있 습 니 다. STL 에서 allocator 는 용기 유형의 일부분 이기 때문에 allocator 가 다 르 기 때문에 용기 의 유형 이 다 릅 니 다. - 그러나 이것 은 STL 이 이런 방식 으로 allocator 를 제공 하 는 것 이 적당 한 지 생각 할 수 밖 에 없습니다.
map 의 operator [] 는 자동 으로 요 소 를 추가 합 니 다. 존재 하지 않 는 다 면.find 와 insert 에 비해 operator [] 가 너무 편리 하기 때문에 이 편리 한 유혹 은 확실히 많은 문 제 를 일 으 켰 다.
템 플 릿 에서 >> 를 > 로 써 야 합 니 다.왜냐하면 >> 이미 점용 되 었 기 때문이다.
exception 을 사용 하지 않 고 exception 을 어떻게 잘 사용 하 는 지 는 너무 큰 화제 이 고 대학 에서 박사 학 위 를 개설 할 수 있 습 니 다.그 중에서 도 이상 안전 중 resource leak, deadlock 은 흔히 볼 수 있 는 문제 입 니 다.
delete [] 는 포인터 로 퇴화 된 배열 을 잘 처리 할 수 있 습 니 다. 클래스 라면 호출 할 석조 함수 s 를 호출 할 수 있 습 니 다. 배열 요소 의 개 수 는 sizeof (memory block)/sizeof (type) 를 통 해 구 할 수 있 기 때 문 입 니 다.
new [] 는 int 의 넘 침 을 일 으 킬 수 있 습 니 다. 예 를 들 어 new double [0x 8000000] = malloc (8 * 0x 80000000) 는 int 의 표현 범 위 를 초과 하여 넘 침 ~ 부분 정적 변수의 초기 화 는 스 레 드 안전 이 아 닙 니 다. - 이 문 제 는 다 중 스 레 드 환경 에서 단일 모델 에서 특히 흔히 볼 수 있 습 니 다. 보통 lock 으로 해결 할 수 있 지만 매번 방문 할 때마다 lock 이 힘 들 기 때문에 double - check lock 방식 을 사용 합 니 다. 그러나 이런 방식 은 컴 파일 러 최적화 로 인 한 reorder 이 고 스 레 드 가 안전 하지 않 으 므 로 volatile 을 사용 해 야 합 니 다.혹은 memory barrier 최적화 방지.이것 은 아마 따로 문장 을 쓸 수 있 을 것 이다.
기본 포인터 로 파생 클래스 의 배열 을 조작 합 니 다. p + 는 다음 요 소 를 가리 키 는 것 이 아니 라 부적 절 한 메모리 주 소 를 가리 키 는 것 입 니 다.
파생 클래스 에 함수 의 이름과 기본 클래스 의 함수 이름 이 중복 된다 면 함수 원형 이 다 르 더 라 도 기본 클래스 의 함 수 는 파생 클래스 에 숨겨 집 니 다.이 점 은 확실히 비교적 지나치다!배후 에는 어떤 원인 이 있 습 니까? 
3. 향후 연구
이름 공간 에 대해 C++ 에 큰 변화 가 있 었 습 니까?이 건 'C++ 언어의 디자인 과 진화' 를 찾 아 봐 야 할 것 같 아 요. C++ 로 좋 은 라 이브 러 리 를 쓰 는 것 은 기본적으로 불가능 합 니 다.나 는 소 를 포함 한 많은 사람들 이 이것 을 말 하 는 것 을 보 았 다. 그러나 목록 을 준 적 이 있 는 지 없 는 지, C++ 의 단점 들 이 좋 은 라 이브 러 리 를 쓸 수 없 게 만 들 었 다. 어떤 언어 가 가능 한 지, 왜?
구조 함수 에서 이상 을 던 져 서 는 안 됩 니 다. Exceptions in constructor don 't unwind the constructor 자체 때 문 입 니 다.이것 은 잘 이해 되 지 않 습 니 다. 제 가 알 기 로 는 구조 함수 에서 이상 을 던 지 는 것 은 구조 함수 가 잘못 보고 한 방법 입 니 다. 구조 함수 자체 가 그 어떠한 값 도 되 돌려 주지 않 기 때 문 입 니 다.
이상 을 던 졌 을 때: Does not even clean up local variables!이해 가 안 돼. 우리 RTTI 는 local 대상 의 분석 구 조 를 이용 하여 메모리 관 리 를 하 는 거 잖 아.
assert(s[s.size()] == 0); works if s is a const std::string, butis unde fi ned if it is not const 가 VC 2008 에서 시험 해 봤 는데 문제 없어 요.왜 그 랬 을 까, 왜? 
If you call delete when you should have called delete [], the pointer will be off by sizeof (int), leading to heap corruption and possibly code execution. 모 르 겠 어 요.
If you call delete [] when you should have called delete, some randomdestructors will be called on garbage data, probably leading to code execution. 왜 delete [] 는 이 배열 에 몇 개의 요소 가 있 는 지 계산 하고 답 은 1 이 어야 합 니 다. 그러면 질문 이 있어 서 는 안 됩 니 다. - 이것 은 이전 답 과 관련 이 있 을 수 있 습 니 다.
출처:http://www.cnblogs.com/baiyanhuang/archive/2011/05/20/2051704.html

좋은 웹페이지 즐겨찾기