【问题标题】:Assignment from std::make_shared to std::shared_ptr fails silently? (VS2012 Bug)从 std::make_shared 到 std::shared_ptr 的分配静默失败? (VS2012 错误)
【发布时间】:2013-10-11 14:51:41
【问题描述】:

编辑:重命名全局变量就可以了。在同一项目的其他 CPP 文件中重复使用了相同的内容。编辑器“混淆”了变量,显示了另一个同名的 shared_ptr 的内容!

感谢所有回答并尝试提供帮助的人;)


在VS2012 IDE,VS2010编译,调试

当从 make_shared 分配时,它不起作用(shared_ptr 保持为 nullptr)。

我可以在调试器中看到调用了类 ctor。

在头文件中

    struct  ROLLWRKAREA  Workarea
    {
        short idLoc;
// ...
    ROLLWRKAREA(short idLocation=LS_NOWHERE) : 
        idLoc(idLocation),
// …
};
typedef std::shared_ptr<ROLLWRKAREA> LPROLLWRKAREA;

在我的 CPP 中 ->

static LPROLLWRKAREA pWA; // ...and pointer

BOOL CRollEx::OnInitDialog ()
{
         CMMDialog::OnInitDialog ();

    pWA = std::make_shared<ROLLWRKAREA>();

… pWA 在这一行之后有空 (nullptr)。

这是预期的吗?我在这里做傻事吗?有解决方法吗?我试图避免使用 .reset(new ROLLWRKAREA())

提前致谢

【问题讨论】:

  • 我无法开始表达我对 LPROLLWRKAREA 这样的类型标识符的看法...
  • @Angew 刚刚注意到
  • 在您发布的(最少的)代码中没有什么明显的。您能否将SSCCE 从您的实际代码中隔离出来并发布?
  • @KerrekSB 试图对 1995-2000 年的遗留 C 代码进行现代化改造。最初是 typedef struct _ROLLWRKAREA {...} LPROLLWRKAREA*, ROLLWRKAREA; :P
  • @Angew 仅此而已 - 结构中的许多其他基本类型变量在 ctor 中初始化。这里没什么特别的——这就是我感到困惑的原因。顺便说一句:pWA.reset(新 ROLLWRKAREA());也不起作用。可能是因为它是 static 吗?可能是因为我有其他全局变量(在其他 CPP 文件中)具有相同的名称(但内部类型不同)?

标签: c++ visual-studio-2010 stl


【解决方案1】:

在 Line
pWA = std::make_shared&lt;ROLLWRKAREA&gt;(); 你需要提供一些东西来共享...
在那之前,你会得到你可以期待的最明智的:NULL

【讨论】:

  • 您将构造函数参数提供给make_shared。如果你不给任何,那么你应该得到一个默认构造的对象,而不是什么。
  • 如果调用的构造函数不带参数应该没问题。
  • std::make_shared&lt;ROLLWRKAREA&gt;()std::shared_ptr&lt;ROLLWRKAREA&gt; pWA(new ROLLWRKAREA) 相同。也就是说,不向 make_shared 提供任何内容将调用默认构造函数 - 不将其设置为 nullptr
  • 这只是另一个 Visual Stuio 错误
  • 标准保证std::make_shared返回的值永远不会是空指针。 (当然,如果代码可以编译,不会抛出异常,并且没有未定义的行为。)
猜你喜欢
  • 2014-08-10
  • 2016-12-27
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2020-04-26
相关资源
最近更新 更多