C++ shared_ptr 객체를 전달받은 함수에서 사용 후 해제하는 방법프로그래밍 노트/C&C++2021. 2. 15. 22:23
Table of Contents
반응형
shared_ptr 객체를 전달받은 함수에서 사용 후, 자원이 해제되는지 확인한 결과입니다.
아직 C++에 익숙하지 못해서 제 맘대로 바꿔보면서 감을 익히는 중입니다.
2021. 02. 15 - 최초작성
shared_ptr 객체를 생성한 후, 함수에 객체를 전달한 후, 지역 변수에 대입해주면 자동으로 shared_ptr의 객체가 자원해제 되는줄 알았습니다.
하지만 예상과 달리 Data 클래스의 소멸자가 호출되지 않았습니다. 소멸자가 호출되었다면 “delete[] buf” 메시지가 출력되야 합니다.
#include <iostream>
#include <memory>
#include <conio.h>
class Data
{
public:
~Data()
{
if (buf != nullptr)
{
delete[] buf;
printf("delete[] buf\n");
}
}
uint8_t* buf = nullptr;
};
void f(std::shared_ptr<Data> _data)
{
std::shared_ptr<Data> data = _data;
}
int main()
{
std::shared_ptr<Data> data = std::make_shared<Data>();
data->buf = new uint8_t[1000];
f(data);
while (1)
{
char ch = getch();
if (ch == 'x') break;
}
}
참조하는 변수의 개수를 출력해주는 use_count() 메소드를 출력해보며 코드를 수정했습니다.
우선 함수로 넘겨줄때 참조(&)를 사용하도록 하고 함수의 지역 변수에 대입시 std::move를 사용하여 객체를 이동시켰습니다.
그 결과 원하는 결과를 얻을 수 있었습니다.
#include <iostream>
#include <memory>
#include <conio.h>
class Data
{
public:
~Data()
{
if (buf != nullptr)
{
delete[] buf;
printf("delete[] buf\n");
}
}
uint8_t* buf = nullptr;
};
void f(std::shared_ptr<Data> &_data)
{
printf("1 - %d\n", _data.use_count()); // use_count : 1
std::shared_ptr<Data> data = std::move(_data);
printf("2 - %d\n", data.use_count()); // use_count : 1
}
int main()
{
std::shared_ptr<Data> data = std::make_shared<Data>();
data->buf = new uint8_t[1000];
printf("0 - %d\n", data.use_count()); // use_count : 1
f(data);
printf("3 - %d\n", data.use_count()); // use_count : 0 -- 함수가 종료된 시점에서 소멸자에서 버퍼의 메모리를 해제한다.
while (1)
{
char ch = getch();
if (ch == 'x') break;
}
}
0 - 1 1 - 1 2 - 1 delete[] buf 3 - 0 |
혹 다른 방법이 있으면 댓글로 남겨주세요.
관련 포스팅
C++ shared_ptr 예제, 사용방법
https://webnautes.tistory.com/1451
반응형
'프로그래밍 노트 > C&C++' 카테고리의 다른 글
C 예제 - CSV 파일 읽기 (6) | 2021.07.04 |
---|---|
C++ 배열(array)과 벡터(vector) 속도 비교 (0) | 2021.03.27 |
Visual Studio 2019용으로 libiconv 빌드하기 및 utf8 <-> cp949 변환 예제 (2) | 2021.02.09 |
Visual Studio 2019에서 MySQL/MariaDB C API 예제 사용하기 (2) | 2021.02.08 |
pthread 람다(lambda) 예제 (0) | 2021.01.28 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
@webnautes :: 멈춤보단 천천히라도
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!