옛날에 kt 에서나온 노키아폰 하나가지고있었는데

노키아 5800 이였음 앱만들려고 c++ 책보고있었는데 사람들이 얘는 일반 c++ 이랑 다르고 어렵다고 해서

좀보다가 ㄹㅇ 잘안되가지고 노키아쪽 sdk문서도 구하기도 어렵고 뭔말인지 몰라서 접었음

---

심비안OS 는 90년대에 개발됨
램도 32MB 시절이고, 2006년에 64MB , 2007년에도 램 96MB, 128MB 인 폰들이 여럿나옴


그래서 오늘 제미나이에게 물어봄


노키아의 변형 c++ 인 "카비드 C++"에서  메모리 관리가 악명 높았던 이유는
가용 메모리가 극도로 적던 시절, 메모리 누수와 시스템 크래시를 원천 차단하기 위해 표준 C++과 완전히 다른 독자적인 규칙을 강제했기 때문입니다.


변형된 심비안 C++ 문법: 표준 C++ 문법과 다르게 메모리 관리를 위한 Cleanup Stack과 같은 독자적인 개념과,
두 단계 생성자(Two-phase Constructor)를 반드시 사용해야 해서 진입 장벽이 매우 높았습니다.

복잡한 포인터 및 메모리 관리: 가비지 컬렉터가 없고 수동으로 메모리를 관리해야 하는 환경에서,
비정상 종료를 막기 위해 Leaves와 Traps라는 독자적인 예외 처리 메커니즘을 숙지해야만 했습니다.




1. 독자적인 예외 처리방법 : 리브(Leaves)

노키아의 카비드 C++은 표준 C++의 예외 처리(try-catch)가 메모리를 지나치게 많이 차지한다는 이유로

이를 금지하고,  리브(Leaves)라는 메커니즘을 사용했습니다.


리브 예외는 다음과 같은 상황에서 발생합니다.


메모리 부족 시 발생: 메모리 할당에 실패하면 시스템이 User::Leave()를 호출합니다.

실행 흐름 중단: 예외가 발생하면 함수 실행을 즉시 중단하고 호출 스택을 거슬러 올라갑니다.

고아 메모리 시 발생: 이때 함수 내부에서 동적으로 할당(New)했던 메모리들의 주소가 사라져 심각한 메모리 누수가 발생합니다.



리브가 발생할 때 클린업 스택이라는 방법으로 해결해야합니다.

2. 클린업스택 (Cleanup Stack)
리브가 발생했을 때 로컬 포인터들이 메모리 누수가 되지 않도록 보호하는 메모리 영역이 바로 클린업 스택입니다.

원리: 생성한 객체의 포인터를 클린업 스택에 잠시 push해 둡니다.
안전 장치: 만약 다음 라인에서 리브(Leave)가 발생하면, 시스템이 클린업 스택을 비우면서 그 안에 있던 객체들을 자동으로 메모리에서 해제(delete)합니다.
수동 해제: 함수가 리브 없이 안전하게 끝나면, 스택에서 포인터를 pop하고 개발자가 직접 해제해야 합니다.


개발자를 괴롭힌 핵심 문법 규칙
클린업 스택을 완벽하게 다루기 위해 개발자는 코드 한 줄을 쓸 때마다 엄격한 명명 규칙과 제약을 따라야 했습니다.

⚠+ 접미사 'LC' 강제
심비안 SDK 로 컴파일하려면 객체를 생성하고 클린업 스택에 넣는 함수 뒤에 반드시 LC를 붙여야 했습니다.
NewL(): 객체를 생성하되 리브할 수 있음.
NewLC(): 객체를 생성하고, 리브할 수 있으며, 클린업 스택에 포인터를 push함.
만약 LC 함수를 쓰고 스택에서 빼주지 않거나, 일반 함수인데 LC를 붙이면 바로 프로그램이 다운되었습니다.


두 단계 생성자 (Two-phase Construction)
C++의 기본 생성자 안에서 리브(Leave)가 발생하면 메모리가 완전히 꼬이기 때문에, 심비안은 생성자를 두 단계로 쪼갰습니다.
1단계 (ConstructL): 표준 C++ 생성자로, 리브 가능성이 없는 안전한 초기화만 수행합니다.
2단계 (ConstructL): 실제 메모리 할당이나 파일 열기 등 리브 가능성이 있는 작업을 수행합니다. 이 때문에 모든 클래스에 NewL()과 NewLC()라는
정적 팩토리 메서드를 만들어 팩토리 패턴을 강제해야 했습니다.


요약:
포인터 하나를 선언할 때마다 Push와 Pop의 타이밍을 완벽하게 맞추어야 했기 때문에,
코드가 조금만 복잡해져도 메모리 누수나 잘못된 스택 참조로 인한 크래시를 잡기가 어려웠습니다.
-----------------------------------


노키아에서 적은 램가지고 잘해보려고 이리저리 머리 썼는데
객체 해제 타이밍 맞추는게 복잡하고 저기 매달리게 되서 앱만들기 어려웠다네

아이폰 앱만드는 오브젝티브 c 가 훨씬 쉬웠다함