밀린 공부...
4w1
RAII (Resource Acquisition Is Initialization)
└ 자원의 할당과 해제를 객체의 생명주기와 일치시키는 기법
- 우리는 자원의 해제(delete)를 직접 해줄필요가 없음! 이거는 스마트포인터로 구현이 된다..
- 생성자에서 자원을 획득하고, 소멸자에서 자원을 반환하는 패턴..!
throw
throw는..
예외가 생기면 throw가 실행되는것? vs throw가 예외를 만드는 것?
정답은.. throw는 예외를 만 드 는 아이!
throw가 실행되면, 예외가 발생하는 것임..
근데 왜 굳이 예외를 .. 발생시키지?
코드를 진행하면서.. 더이상 정상적인 흐름으로 처리할 수 없는 상황에서 프로그램을 비상탈출하려고!
throw를 던지면.. catch가 잡아준다.
try내에서..

이렇게.. throw 1;를 던지면 밑에서 catch가 잡아줌

이런식으로 비상탈출하고 끝난다..
그리고 f(); 를 꼭 try안으로 넣어줘야함. 안그럼.. 중간에 터지더라고여
Stack Unwinding (스택 풀기)
└ 현재 함수부터.. 호출한 함수까지 거꾸로 돌아가며.. 스택에 있는 지역 객체들의 소멸자가 자동으로 호출되는 것!
예외가 발생했을 때..
지역 객체는 자동으로 정리됨.. try밖 catch문을 찾을 때 까지!
throw가 실행됨 -> 현재 함수에서 예외를 처리할 catch블록을 찾기위해 함수 스택을 거꾸로 푼다
-> 그 과정에서 각 함수 안의 지역 변수(객체)들이 자동으로 소멸자 호출이 된다.. => 이게 stack unwinding
SmartPointer 스마트 포인터
└ 단 하나의 객체만 소유하는 애 (다른애가 참조가 안됨) -> 이건 shared_ptr..
└ 객체가 소멸하면 delete/delete[]를 자동으로 호출해줌!
메모리를 자동을 해제해준다!!!-> RAII 가 자동 적용된다!

문법은..
std::unique_ptr<객체> 스마트포인터명(new 객체)
std::unique_ptr<객체> 스마트포인터명 = make_unique<객체>(인수)
이렇게 쓰지만 make_unique를 쓰는게 더 좋다..! modern 방식이라고함..
make_unique는 내부에서 new를 호출해서 바로 unique_ptr에 넣어줌..



이렇게.. 배열로 사용하고싶으면 Dog[ ]를 해준다
위에는 3이 age인자로 들어간 Dog를 생성하고..
밑에는.. 그냥 3개의 Dog 객체를 생성한거라 기본 멍멍이 생성자가 호출 된다..
==> 배열 버전에서는 초기값을 줄 수 없다고 한다.. 배열로 만들 때는 매개변수가 없는 생성자만 호출 가능하니까..

자 이거는.. 스마트포인터가 어떻게 작동되는지 눈에 보이게 해둔 코드
생성자에서 자원 획득,
소멸자에서 자원 해

외부에서 이렇게 new Dog로 생성된 포인터를 받아서 저장.. (인자가 Dog* p 니까)
소멸자에서는 이 p를 deleteㅎ ㅐ서 자원을 해제
예외 발생해도.. 어차피 스마트포인터는 지역변수로 소멸-> 그 소멸하면서 p를 delete함 -> 자동으로 delete 수행한겨
이 스마트포인터가 삭제되면, Dog*도 삭제됨.
(이게 unique_ptr이 내부적으로 돌아가는 방식... 우린 그냥 직접 이런거 만들지 말고 그냥 unique_ptr이나 사용하도록 하자^^..)
std::transform
stl에서 많이 쓰이는 변환기!
컨테이너나 반복자 범위의 각 요소에 어떠한 함수를 적용해서 바꿔주는 알고리즘
std::transform(입력시작, 입력끝, 출력시작, 함수)

이러면.. in시작부터~ 끝까지
[](char c) return toupper(c)를 반환하는 함수를 적용해서
out시작부터~ 써주는 것..!
STL 알고리즘

std::iota : 연속된 값을 배열이나 메모리에 채울 때 사용!
[p, p+num) 범위에 대해 1씩 증가하는 값을 넣어줌 ( 마지막 인자는 그 숫자부터 1을 더해라~ 라고 정해주는 것 )

std::accmulate : 합계 구할 때 사용!
[p, p+num) 범위의 합을 계산해준다 / 마지막 인자에는 몇부터 더할거니? 근데 우리는 0LL을 넣어준다..
ㄲㅡㅌ
'cpp(stl)' 카테고리의 다른 글
cpp8(callable) (0) | 2025.04.11 |
---|---|
cpp7(함수포인터/collable/람다) 4w2 (0) | 2025.04.11 |
cpp5(stream_iterator/vector로 파일읽기/structured binding/연산자오버로딩) (0) | 2025.03.27 |
cpp4(파일입출력/바이너리모드/저수준출력) (0) | 2025.03.19 |
cpp3(안전배열/file입출력) (0) | 2025.03.19 |