`head`가 NULL인 경우 현재 노드(tmp)는 연결된 목록의 첫 번째 노드이며 이것이 `head`와 `tail`이 될 것입니다(현재 마지막 요소이기도 합니다). 우리가 보호하려는 코드 #including 헤더로 헤더 파일의 선언 및 매크로에서 코드를 절연하는 인수가 있습니다 («bad»라고 표시된 예제와 같이). 그러나 새 노드를 삽입하려는 위치에 사용자에게 요청하여 이러한 노드에 액세스합니다. 이제 이러한 특정 노드에 도달하는 루프를 시작합니다. 우리는 머리에 의해 현재 노드를 초기화하고 연결된 목록을 통해 이동합니다. 결국, 우리는 두 개의 연속 노드를 찾을 것입니다. 예를 들어 제3자 C 라이브러리 또는 C 시스템 인터페이스를 사용하려면 더 나은 형식 검사를 위해 C 및 C++의 공통 하위 집합에서 하위 수준 인터페이스를 정의합니다. 가능하면 C++ 지침을 따르는 인터페이스에서 하위 수준 인터페이스를 캡슐화하고(추상화, 메모리 안전 성 및 리소스 안전성 향상) C++ 코드에서 해당 C++ 인터페이스를 사용합니다. 나는 또한 링크 된 목록에 하나의 노드 (우리가 만들 려고하는)가 있다면 머리와 꼬리라고합니다.

예를 들어, 다른 개발자가 개체의 생성자 내부에서 singleton을 사용하는 상황을 예로 들어 보겠습니다. 그런 다음 다른 개발자가 전역 범위에서 두 번째 클래스의 인스턴스를 만들기로 결정합니다. 전역 변수를 단순히 사용했다면 연결 순서가 중요합니다. main 실행이 시작되기 전에 전역에 액세스할 수 있으므로 전역이 초기화되었는지 또는 두 번째 클래스의 생성자가 첫 번째로 호출되는지에 대한 정의는 없습니다. 그런 다음 이 동작은 다른 코드 영역을 약간 수정하여 전역 코드 실행 순서를 변경할 수 있습니다. 이러한 오류는 디버깅하기가 매우 어려울 수 있습니다. 그러나 singleton을 사용하여 개체에 처음 액세스할 때 개체도 만들어집니다. 이제 사용과 관련하여 항상 존재하며 사용하지 않으면 존재하지 않는 객체가 있습니다. 불완전하거나 잘 지정된 의미 체계가 없는 «개념»은 여전히 유용할 수 있습니다. 예를 들어, 초기 실험 중에 일부 검사를 허용합니다.

그러나 안정적이라고 가정해서는 안 됩니다. 각각의 새로운 사용 사례는 이러한 불완전한 개념을 개선해야 할 수 있습니다. 규칙은 최소 또는 직교를 위한 것이 아닙니다. 특히 일반 규칙은 간단할 수 있지만 적용할 수 없습니다. 또한 일반적인 규칙의 의미를 이해하기가 어려운 경우가 많습니다. 보다 전문화된 규칙은 종종 이해하기 쉽고 적용하기 쉽지만 일반적인 규칙이 없으면 특별한 경우의 긴 목록이 될 것입니다. 우리는 초보자를 돕기위한 규칙뿐만 아니라 전문가 사용을 지원하는 규칙을 제공합니다. 일부 규칙은 완전히 적용할 수 있지만 다른 규칙은 추론을 기반으로 합니다. 아무리 많은 시도를 해도 동적으로 할당된 모든 메모리를 확보하는 것은 매우 어렵습니다. 우리가 그렇게 할 수 있더라도 예외로부터 안전하지 않은 경우가 많습니다. 간단한 예를 살펴 보겠습니다: 정렬을 컨테이너의 멤버 함수로 정의하는 것은 어리석은 생각일 수 있지만 전례가 없으며 하지 말아야 할 일의 좋은 예입니다.

이제 이 함수는 연결된 목록이 여전히 비어 있으면 어떤 일이 일어날지 알고 싶어하는 매우 특별한 경우를 갖게 될 것입니다. 우리는 그것을 확인해야합니다. 헤드가 첫 번째 노드를 가리킨다는 것을 기억하십니까? 즉, 머리가 NULL과 같으면 연결된 목록이 비어 있다고 결론을 내릴 수 있습니다. 예외에 대한 두려움은 많이 잘못 인도됩니다. 포인터와 복잡한 제어 구조가 산재해 있지 않은 코드에서 예외적인 상황에 사용할 경우 예외 처리는 거의 항상 시간과 공간에서 저렴하며 거의 항상 더 나은 코드로 이어집니다.