반응형

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 



반응형

해보고 확인한 것을 문서화하여 기록합니다.
최소 일주일에 한번 이상 포스트를 하려고 노력중입니다.

부족함이 있지만 도움이 되었으면 합니다.
잘못된 부분이나 개선점을 알려주시면 감사하겠습니다.



포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
시간날때 마다 이전 포스트가 문제 있는지 확인을 해보려고 노력하고 있습니다.
질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">