반응형

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 



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


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

+ Recent posts