C ++ shared_ptr вызов деконструктора собственного объекта - PullRequest
0 голосов
/ 25 мая 2018

У меня есть этот код

class TC
{
public:
   TC()
   {
        i_idx = s_idx++;
        Serial.printf("TC Construct %d\r\n", i_idx);
  };

  virtual ~TC()
  {
        Serial.printf("TC Deconstruct %d\r\n",i_idx);
  };

  int i_idx;
  static int s_idx;
};

int TC::s_idx = 0;

void setup()
{
    Serial.begin(115200);
    Serial.printf("\r\n\nSetup start\r\n");
    std::shared_ptr<TC> stc = std::make_shared<TC>(TC());
}

void loop()
{
}

При исключении я получаю результат:

Setup start
TC Construct 0
TC Deconstruct 0
TC Deconstruct 0

Я ожидал, что деконструктор на TC будет вызван только один раз, когда shared_ptr выйдетобласти видимости.

Кто-нибудь знает причину второго звонка?

1 Ответ

0 голосов
/ 25 мая 2018

Кто-нибудь знает причину второго вызова?

Поскольку построены два объекта.При std::make_shared<TC>(TC()); временное TC сначала создается TC(), затем оно копируется для создания 2-го объекта, которым управляет std::shared_ptr.

. Вы можете добавить конструктор копирования / перемещения дляболее четкое наблюдение;вы увидите дважды строительство и два разрушения.например,

class TC
{
public:
  TC()
  {
        i_idx = s_idx++;
        Serial.printf("TC Construct %d\r\n", i_idx);
  }

  TC(const TC&)
  {
        i_idx = s_idx++;
        Serial.printf("TC copy Construct %d\r\n", i_idx);
  }

  TC(TC&&)
  {
        i_idx = s_idx++;
        Serial.printf("TC move Construct %d\r\n", i_idx);
  }

  virtual ~TC()
  {
        Serial.printf("TC Deconstruct %d\r\n",i_idx);
  }

  int i_idx;
  static int s_idx;
};

Кстати: для этого случая временный ненужный, вы можете просто std::make_shared<TC>();.

...