Language/C++
[C++] 스마트 포인터
0so0
2023. 9. 25. 19:00
728x90
반응형
SMALL
스마트 포인터에 대한 정리
SMALL
반응형
RAII(Resource acquisition is initialization) 패턴
객체가 쓰이는 Scope를 벗어나면 Resource를 해제해주는 기법
bool error() {
return true;
}
void fnc() {
int* c = new int[100];
if (error()) return;
delete[] c;
}
int main(void) {
fnc();
_CrtDumpMemoryLeaks();
return 0;
}
Detected memory leaks! Dumping objects -> {156} normal block at 0x00C60C58, 400 bytes long. Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD Object dump complete.
위와 같이 예외(에러)가 발생할 경우 c가 소멸되지 않아 메모리 누수가 발생하기 때문에 이 문제를 해결하기 위해 RAII 패턴 도입
* _CrtDumpMemoryLeaks() 관련 내용은 아래 참고
스마트 포인터(Smart pointer)
메모리 누수(memory leak)로 부터 프로그램의 안정성을 보장하기 위해 C++에서 제공하는 기능
unique_ptr
하나의 스마트포인터만이 특정 객체를 소유할 수 있도록 객체에 소유권 개념을 도입한 포인터
소유권을 이전할 수 있지만 스마트포인터가 객체의 소유권을 가지고 있을 때에만 소멸자가 해당 객체를 삭제가능
int main(void) {
int* temp = new int;
*temp = 1;
unique_ptr<int> u1(temp);
cout << "u1 : " << *u1 << endl;
unique_ptr<int> u2(new int(2));
cout << "u2 : " << *u2 << endl;
// u1의 소유권 이전
unique_ptr<int> u3 = move(u1);
cout << "u3 : " << *u3 << endl;
// u1의 소유권이 이전되어 u1 복사시 compile error 발생
unique_ptr<int> u4 = u1;
}
std::make_unique
지정된 타입의 객체 생성, 생성된 객체를 가리키는 unique_ptr 반환
class test {
int a, b;
public :
test(int a, int b) : a(a), b(b){
}
int add() {
return a + b;
}
~test() {
}
};
int main(void) {
auto ptr = make_unique<test>(2, 3);
}
shared_ptr
하나의특정 객체를 참조하는 스마트 포인터가 몇개인지 확인하고, 참주 횟수가 0이 되면 메모리를 자동 해제(delete)하는 포인터
int main(void) {
// shared_ptr<객체> s1(new 객체);
shared_ptr<int> s1(new int(5));
cout << "s1 : " << *s1 << endl;
cout << "s1 use_count : " << s1.use_count() << endl;
auto s2 = s1;
cout << "s2 use_count : " << s2.use_count() << endl;
s1.reset();
cout << "s2 use_count : " << s2.use_count() << endl;
s2.reset();
return 0;
}
weak_ptr
shared_ptr에서 순환 참조가 일어나는 것을 제거하기 위해 사용하는 포인터
shared_ptr 인스턴스가 소유하는 객체에 대한 접근만 허용
728x90
반응형
LIST