1

У меня есть вопрос о указателе в C++.Может ли указатель 'this' быть общим указателем?

Если я создаю указатель,

std::shared_ptr<SomeClass> instance_1; 

ли this указатель instance_1 также общий указатель?

Причина, по которой я задаю этот вопрос, заключается в том, что я начинаю использовать другой поток в своем методе с помощью указателя this. Скопирует ли он shared_ptr?

+1

'this' всегда сырой указатель. Но ваш класс может быть получен из 'std :: enable_shared_from_this', чтобы позволить его методам возвращать' shared_ptr' 'this' – KABoissonneault

+2

. Но см. [' Std :: enable_shared_from_this'] (http://stackoverflow.com/a/ 11711094/751579). – davidbak

+1

Возможный дубликат [как вернуть общий \ _ptr текущему объекту из самого «этого» объекта] (http://stackoverflow.com/questions/36863240/how-to-return-shared-ptr-to-current- объектно-из-внутри-это объектно-сам по себе) – davidbak

ответ

3

Является ли указатель this указателем instance_1 также общим указателем?

порядка № this указатель указатель на текущий экземпляр объекта, это указывает на тот же общий объект в качестве совместно используемого указателя в этом случае. Но это само по себе не shared_ptr. Он имеет тип SomeClass*.

Причина, я задаю этот вопрос ...

Чтобы создать shared_ptr из this, SomeClass должны быть получены из std::enable_shared_from_this. Тогда вы можете использовать;

shared_from_this(); возвращает shared_ptr, который разделяет собственность *this

При совместном состоянии, как это между нитями, быть осторожными в условиях гонки и запирающие вопросы и т.д.

0

No, this всегда является необработанным указателем. Если вы хотите, чтобы в другом потоке была копия shared_ptr, вам нужно будет указать его instance_1.

2

Нет, вы не можете сделать this для общего указателя. Ближайшая вещь, чтобы наследовать от std::enable_shared_from_this и получить общий указатель по телефону:

this->shared_from_this(); 

деталь может быть найдена here

Другой альтернативой была бы использовать навязчивый общий указатель, как boost::intrusive_ptr, где this не будет общим указатель хотя и может быть преобразован в один.

2

№. Создание общего указателя на объект не делает this в объекте общим указателем.

Если вы хотите получить общий указатель от this, вам может потребоваться, по крайней мере, использовать std::enable_shared_from_this.