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
。任何其他时候你发现自己不得不move
和unique_ptr
,警钟应该响起。还有其他一些原因,但很少见。
【参考方案1】:
智能指针包含一个原始指针,因此它需要指向某个东西。该错误清楚地表明它没有指向任何内容。您的代码中是否有 new
或 std::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++ + OpenCV = 访问冲突读取位置 0x02176000