C ++, Shared_ptr, подскажите пожалуйста, почему мой код выдает ошибку? - PullRequest
1 голос
/ 10 апреля 2020

Ошибка получения -

1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include\memory(1143,17): message : could be 'std::shared_ptr<int> &std::shared_ptr<int>::operator =(std::shared_ptr<int> &&) noexcept'
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.25.28610\include\memory(1132,17): message : or       'std::shared_ptr<int> &std::shared_ptr<int>::operator =(const std::shared_ptr<int> &) noexcept'
1>E:\VS\HelloWorld\HelloWorld\main.cpp(14,10): message : while trying to match the argument list '(std::shared_ptr<int>, int *)'
1>Done building project "HelloWorld.vcxproj" -- FAILED.
#include <iostream>
#include <vector>
#include <algorithm>
#include<string>
#include  <memory>

using namespace std;

int main()
{
    shared_ptr<int> ptr = make_shared<int>();
    int l = 10;
    ptr = &l;
    cout << (*ptr) << endl;

    cin.get();
}

1 Ответ

2 голосов
/ 10 апреля 2020

Вам разрешено назначать только std::shared_ptr<> или std::unique_ptr<> переменной типа std::shared_ptr<>, см. Документацию std::shared_ptr<>::operator=() Это позволяет избежать ошибок при назначении указателя. ему, который не выделен в куче, как вы пытаетесь сделать в своем коде.

Обратите внимание, что ваш вызов std::make_shared<int>() уже выделяет память для int, так почему бы не использовать это?

std::shared_ptr<int> ptr = std::make_shared<int>();
*ptr = 10;
std::cout << *ptr << '\n';

Вы можете даже написать это укорочение и избежать повторения:

auto ptr = std::make_shared<int>(10);
std::cout << *ptr << '\n';

Если вы действительно хотите назначить другой указатель на ptr, то вы должны убедиться, что указатель является общим или а также уникальны:

std::shared_ptr<int> ptr;
std::shared_ptr<int> l;
*l = 10;
ptr = l;
std::cout << *ptr << '\n';
...