수치심의 20 라인

2009년 4월 5일 ·에 게시된 C / C + + , 여론

쌀 요리는 않지만, 나는에서의 메모리 관리와 관련된 초기 경력에 내게 일어난 흥미로운 사건을 기억하는 C + +. 그 당시 나는 훨씬 더했습니다. 더 거만 많은 초보자와 어린, 더 빨리 ...

경험 많은 동료가있는 모든 위해 해당 삭제 있어야한다고 또 다른 경험이 적은 동료에게 설명했다. 그렇지 않으면 개체가 메모리에 유지되며 메모리 누수가있을 수 있습니다.

이 시점에서 그 사람을 방해하고 "그것이 범위의 대상 밖이 소멸자가 자동​​으로 호출됩니다 있도록 충분하지 반드시 때문입니다."고 말했다.

그 때부터 인수 및 카운터 인수로 10 분 토론이 롤백, 그리고 팀 전체가 지켜보고 중단되었습니다. 결국, 절반 팀은 그와 나와 함께 나머지 절반은 동의하고, 그 시점은 아무도 염두에두고 확인하는 방법이 없었습니다. 인터넷에서 보라는 옵션이 아니었다.

나는 이미 PHP, 자바와 C로 프로그래밍해서, 모든 대답을 가지고 마찬가지로 + + 나중에 내 가슴을 찢는 것을 보여줄 것이었다.

일 후, 그 철학적 순간, 나는 메모리 주소는 두 번째 옵션은 일반적으로 무의미한 있지만 당신도 공통 번호로 주소를 변환하고, 다른 방법으로 갈 수있는 숫자는 것을 기억.

그리고는 내 이론을 증명하는 방법 생각해낸 : 그것은 새로운 할당 제한된 범위를 가진 개체를 만들 것입니다. 내가 제한된 범위의 밖의 일반적인 숫자로이 개체의 주소를 유지할 것이 제한된 범위를 마무리 기대 obejto의 소멸자도 호출하고 바깥쪽 범위는, 메모리의 영역을 액세스하는 개체의 주소를 나타내는 숫자를 사용합니다 받을 것을 보여주는 SIGSEGV가 잘못된 메모리 영역에 접근을 시도하여 (분할 오류). 그렇다면 아래 코드를 생성.

 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
  # 포함
 # <string> 포함

 네임 스페이스 표준을 사용;

 int argc, char ** argv ) { int는 메인 (int는 argc, 문자 ** argv가) {
     0 ; 서명되지 않은 긴 = 0;

     {
         new string ( "Hello World!!!" ) ; * str을 보여주고 =  문자열 ( "안녕하세요!");
         unsigned long ) str ; NUM = (부호없는 긴)는 str;

         "str: " << str << endl ; cout << "하위 버전 :"<< endl << str을 보여주고;
         "num: " << num << endl ; cout << "개수 :"<< endl <<;
     }

     * ( ( string * ) num ) << endl ; cout << * ((* ​​문자열)) << endl;

     ; 0을 반환;
 } 

프로그램이 내 얼굴에 폭발되지 놀랍게도, 보라. 그는 정확하게 사실 제가 잘못 생각 한 것을 보여주했습니다.

이상 제가 예, 거기에 각각에 대해 새이어야하며만을 삭제해야한다는 실감하고, 각각의 새로운에 대한 더 검색은 [] 하나와 하나가 []를 삭제해야합니다. 제가 메모리 관리 및 범위에 대해 알고 생각했는지, 아마 다른 언어 간의 몇 가지 혼란했습니다.

나는 토론 일 전 시작했을 때, 나는 초보자가 저지른 모든 기본적인 실수를했다 :

  1. 그것 불리는 곳이 간섭.
  2. 욕설 어떤 증거도없이 바로 무엇 대기.
  3. 경험 많은 사람의 지식을 과소 평가.
  4. 당신은 그냥 클래스에서 참조해서이 모든 답을 다 아는 것 같다.
  5. 그들은 여러 언어의 기초를 알아야하기 때문에 이렇게 모든 해답을 가지고 있다고 생각합니다.

종의 어떤 좋은 멤버와 마찬가지로 sapiens 호모 , 똥을 했어요. 이 발견에 대한 나의 반응은 전체 팀을 데리고와 내가 헛소리에 사과 이것을 입증하는 데 사용할 코드 이십 라인을 보여, 틀렸습니다. 또한, 나는 모든 소스를 연구 것으로 나타났다, 그리고 우리처럼 탈출하고 있다고 메모리 관리에 관한 기타 세부 사항도 내신 순환 참조 . 이것은 프로젝트의 몇 가지 부품을 다시 desing로 이끌었다.

제 20 줄을 cógigo은 "수치심의 20 줄을"로 알려진되었고 natualmente 난 너무 패배했습니다. 누구든지 의심 있었 때마다 "테스트 vegonha 20 라인이있다."이야기 의미는 "나중에 망신 당할 수있는 간단한 테스트가있다."같은 일이었습니다

가장 중요한 것은 내 사후 이런 태도가 잘 접수 및 팀에 혜택을 가져온다고합니다. 조만간 떨어져 shied다면 어떤 사람이 내가 장면 뒤에, 모두, 또는 더 나쁜 앞에 틀렸습 증명할 것이다. 실수를 인정하고 배울는가 도전을받을 준비가되었음을 보여주었다. 이 팀의 외에도 더 많은 나는 (나는 나보다 더 닮았 ...) 거만하게 보였습니다, 나는 그것이 평범한 인간 알았 것을 보여주었다, 그는 누구로, 나는 누구보다도 생각하지 않는 실수를했습니다. 다른 팀 구성원이 똑같이 부담하고 우리가 더 응집력 팀이되기 위해 이것을 용이하게했다.

댓글

  • 마르쿠스 안토니우스

    아주 재미있는 이야기!
    토론회를 따라 사람들에게 더 많은 짐을!

    또 다른 흥미로운 점은 우분투의 새 릴리스 18 일이 없다는 것입니다!
    (그러나 지금은??? 시간은 빠르다!)

  • http://blabos.org blabos

    최근 나는, 순간 이동의 안해요를 조종하고있는 게 아니 time're ...

  • Junio

    Blabos, 경험을 전달 주셔서 감사합니다. 아주 리치 텍스트입니다. 당신에게 평화와 건강.

  • ♣ ♦ ♥ ♠ 익살 히메

    그것은 운영 체제에 의해 보호되지 않는 deallocated 메모리를 액세스할 때 흠 ... 난 당신이 사용하거나 언어의 어떤 버전의 어떤 컴파일러는 모르겠지만, 나도 알아, C는 오류를 표시하지 않습니다 ... C + + 디스플레이를?

  • Blebe의 http://blabos.org Blabos

    방문에 대한 최초의 감사!

    은 C + + G와 + + 작은 제자 :)

    만일 "디스플레이 오류"고려 무엇에 따라 달라집니다.

    컴파일 타임이나 런타임에서?

    위의 경우, 무경험 (이 cacophonous!), 영역을 가리키는 포인터가 derreferenciação 다음 (이전) deallocated 메모리 (동적으로 C + +에서 할당된 개체에 대해 존재하지 않습니다) 파괴 자동 출력 범위를 예상 , 런타임에 치명적인 오류를 일으킨다.

    추가 delete str; 온라인 14 시간 후엔 당신이 미묘한 차이를 알 수 있습니다.

    두 테스트는 컴파일 시간에 아무런 경고를 제공하지 않습니다.

  • ♣ ♦ ♥ ♠ 익살 히메

    아니, 나도 같은 런타임 말하다 ... 내가 프로그램으로 학습되었다 처음에는 우리 선생님은 우리에게 alloc, malloc과 calloc 전에 벡터를 가르치고 따라서, 우리는 메모리를 할당하지 않고 자유롭게 벡터를 이용 ...

    거의 메모리 보호된 운영 체제의 오류를 줬어도 ...
    또한, 어떠한 오류가 나타나거나 편집하거나 실행하지 않았다.

    물론이 개체 아니라, 그것이 구조적 프로그래밍의 수업, C에서만했습니다 ... 그래서 내 질문 ...에서 C + 제가 메모리를 안 사용하려고하면 +, 대신 alloc의 새로운 사용하는 프로그램은 런타임에 오류를 발생 할당된?

    나는 결국, 언어 사양을 참조 소멸자와 메모리를 할당을 취소, 프로그램 또는 무언가의 완성 때까지 그들을 보호할 수있는 것이 좋을 것이다 생각은 ... 그런 일은하지 않는 이유는 무엇입니까?

  • Blebe의 http://blabos.org Blabos

    메모리 배열이 존재해야합니다에 대한 용어는 "우리가 메모리를 할당하지 않고도 자유롭게 사용할 벡터는"아주 잘못된 것입니다. 아마 당신은 "우리는 벡터는 동적으로 메모리를 할당하지 않고 자유롭게 사용."의미

    사양은 derreferenciar 대부분의 시스템 (전부는 아니지만)에 치명적인 오류를 의미 정의되지 않은 동작에서 NULL 포인터 결과를 말합니다.

    이것은 위에 표시된되는 아닙니다. 예제에서 지역 '기발한'deallocated에 액세스하려는 시도가있다.

    NULL 포인터! 유효하지 않은 메모리 영역에 = 포인터.


    int* ptr_null = 0;

    / / NULL 포인터 ptr_null인가

    ptr_foo INT * = 새로운 INT (123,456);
    ptr_foo를 삭제;

    메모리 영역에 대한 / / Ptr_foo 포인트
    / /이 프로그램에 속해도 더 이상

    printf ( "% PN", ptr_null);
    printf ( "% PN", ptr_foo);

    당신은 그 차이를 볼 예제를 컴파일하고 실행합니다.

    마지막 단락에 대해서, 아니, 그게 무슨 일이 아니에요. 당신이 물건을 혼합하고, 소멸자 단지 개체가 deallocated 때 중 하나에 대한 호출에 의해 자동으로 호출되는 루틴이다 delete 스택에 할당된 개체의 출력이나 범위에서 동적으로 할당된 객체.

Disqus에 의해 전원 블로그 덧글