【问题标题】:C++,Shared_ptr, Please tell me why my code is giving an error?C++,Shared_ptr, 请告诉我为什么我的代码出错了?
【发布时间】:2020-07-23 07:50:38
【问题描述】:

出现错误-

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();
}

【问题讨论】:

  • 您收到的错误消息说明了一切。 std::shared_ptr&lt;int&gt; 没有接受 int * 作为参数的 operator=()。也没有将int * 隐式转换为std::shared_ptr&lt;int&gt;,因为将执行该转换的shared_ptr 构造函数标记为explicit。所有这些结合起来使分配 ptr = &amp;l 无效。
  • *ptr = l;替换ptr = &amp;l;

标签: c++ c++11 shared-ptr


【解决方案1】:

您只能将另一个std::shared_ptr&lt;&gt;std::unique_ptr&lt;&gt; 分配给std::shared_ptr&lt;&gt; 类型的变量,请参阅std::shared_ptr&lt;&gt;::operator=() 的文档 这可以防止您在分配未分配的指针时出错在堆上,就像您在代码中尝试做的那样。

请注意,您对std::make_shared&lt;int&gt;() 的调用已经为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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多