C++ 读取访问冲突。 _Val 为 nullptr [关闭]

Posted

技术标签:

【中文标题】C++ 读取访问冲突。 _Val 为 nullptr [关闭]【英文标题】:C++ Read access violation. _Val was nullptr [closed] 【发布时间】:2019-01-17 19:52:17 【问题描述】:

我正在尝试设置一个包含在结构中的变量的值,该结构被一个智能指针指向。

对于上下文:

// Represents a node in the search tree.
struct SNode

  int x;             // x coordinate
  int y;             // y coordinate

指针(声明为unique_ptr<SNode>start)称为start

我正在从文件中读取数据,这是问题所在:

inFile >> move(start)->x;

执行时,执行此行,“istream”内出现以下错误:

“抛出未处理的异常:读取访问冲突。 _Val 为 nullptr。”

我对智能指针的概念还很陌生,所以我不太清楚我个人是否在这里做错了,所以感谢任何帮助。

【问题讨论】:

请提供minimal reproducible example,而不是代码描述。 你为什么使用move() @JamesEaston 听起来您不了解指针如何工作的基本原理,更不用说智能指针如何工作了。你还有一些学习要做。 如果你提供一个最小的例子,我们可能会解释这一点。目前没有足够的上下文。 除非您想转移指针的所有权,否则您不需要使用move。任何其他时候你发现自己不得不moveunique_ptr,警钟应该响起。还有其他一些原因,但很少见。 【参考方案1】:

智能指针包含一个原始指针,因此它需要指向某个东西。该错误清楚地表明它没有指向任何内容。您的代码中是否有 newstd::make_unique<> 语句?

你需要这样的东西:

unique_ptr<SNode> start(new SNode);

或者:

unique_ptr<SNode>start = std::make_unique<SNode>();

【讨论】:

效果很好!那么使用(new SNode) 会创建一个名为SNode 的新实例start @JamesEaston 这是正确的想法。它确实创建了一个实例,但 start 是一个保存该实例的智能指针。 啊,很有道理,非常感谢!

以上是关于C++ 读取访问冲突。 _Val 为 nullptr [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 读取访问冲突,0xCDCDCDCD

C++ + OpenCV = 访问冲突读取位置 0x02176000

访问冲突 C++(删除向量中的项目)

读取访问冲突 _First 为 nullPtr

当我尝试删除数组时,C++ 访问冲突读取位置 0xDDDDDDCD 已更新

抛出异常:读取访问冲突。 **bp** 为 0xFFFFFFFFFFFFFFFF