Назначение shared_ptr другому после вызова get - PullRequest
0 голосов
/ 21 мая 2019
shared_ptr<std::string> shared_ptr1 = std::make_shared<std::string>("Foo");
shared_ptr<std::string> shared_ptr2 = std::make_shared<std::string>("Bar"); 

std::string* normal_ptr = shared_ptr1.get(); 
shared_ptr1 = shared_ptr2; 

Теперь, будет ли первая строка "Foo" собираться мусором после назначения " shared_ptr1 = shared_ptr2 "?Согласно это , "Foo" не является сборщиком мусора.Но я просто хочу убедиться, что то, с чем я сталкиваюсь, не является неопределенным поведением.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 мая 2019

Теперь, будет ли первая строка «Foo» собираться мусором после назначения «shared_ptr1 = shared_ptr2»? *

Если вы имеете в виду, будет ли строка, выделенная std::make_shared<std::string>("Foo")быть уничтоженным, тогда да.

Это означает, что normal_ptr после того, как вы сделаете shared_ptr1 = shared_ptr2;, указывает на объект, который больше не существует.

2 голосов
/ 21 мая 2019

Я бы не использовал фразу "сбор мусора".После упомянутого присваивания объект будет просто удален, потому что на него не указывает ни один shared_ptr.Вы можете проверить его с помощью следующего кода:

struct S{
    std::string s;
    S(std::string s){
        this->s = s;
    }
    ~S(){
        std::cout << "~S() with string " << s << std::endl;   
    }
};

int main()
{
    std::shared_ptr<S> shared_ptr1 = std::make_shared<S>("Foo");
    std::shared_ptr<S> shared_ptr2 = std::make_shared<S>("Bar"); 

    S* normal_ptr = shared_ptr1.get(); 
    std::cout << "after get()" << std::endl;
    shared_ptr1 = shared_ptr2;
    std::cout << "end of main" << std::endl;
}

, который дает

after get()
~S() with string Foo
end of main
~S() with string Bar

, что означает, что после присвоения normal_ptr указывает на несуществующий объект.

...