Можно ли использовать std :: shared_ptr? ? - PullRequest
0 голосов
/ 12 февраля 2020

Эта проблема беспокоила меня долгое время, пожалуйста, помогите мне, спасибо!

Вопрос 1:

{
  {
    std::shared_ptr<int*> t1 = make_shared<int *>(new int(3));
  }
 // here t1 is point heap,when the t1 died,the heap of int(3) is not free
 // in stack is correct
 {
    std::shared_ptr<int> t1 = make_shared<int>(); 
  }
 // how to reslove this ? Is `std::shared_ptr<int* >,std::shared_ptr<string* > ...` is forbiden?
}

да, я хочу, чтобы ponts структура, но это делает не получается вызвать деструктор ,, как в этом примере


class DelTest
{
public:
    DelTest() {

        cout << " DelTest()" << ":" << i++ << endl;
    }

    ~DelTest() {

        cout << "~ DelTest()" << ":" << j++ << endl;
    }

};
void test()
{
   std::shared_ptr<DelTest*> t1 = make_shared<DelTest*>(new DelTest);
}

, когда тест пройден, ~ DelTest () не может работать; я хочу использовать std::map<int, std::shared_ptr<DelTest*>> m; для замены std::map<int, DelTest*> m;

std::map<int,  std::shared_ptr<DelTest*>> m
for (auto it = m.begin(); it != m.end(); ++it)
{
    m.erase(it);
}

~ DelTest () не работает

1 Ответ

1 голос
/ 12 февраля 2020

Можно ли использовать std::shared_ptr<T*>?

Зависит от того, что вы подразумеваете под OK. Хорошо ли он сформирован и имеет ли он четко определенное поведение? Да.

Вам это нужно? Может быть; возможно нет; зависит от варианта использования.

std::shared_ptr<int*> t1 = make_shared<int *>(new int(3));

Это плохо. Не используйте собственные голые указатели. Вы можете забыть удалить его и вызвать утечку памяти.

std::shared_ptr<int> t3(new int[10], [](int*p) {delete[] p; });

Начиная с C ++ 17, используйте std::shared_ptr<int[]>. В противном случае рассмотрите возможность использования std::shared_ptr<std::vector<int>> для простоты.

...