【问题标题】:c++ boost iterator throwing assert and programme terminatesc ++ boost迭代器抛出断言和程序终止
【发布时间】:2012-03-10 13:27:57
【问题描述】:

我在这一行收到以下错误:

const short pcmSample = *reinterpret_cast<const short*>(*(buffer->index));

buffer 是类accumlator 的对象。

我在这里尝试将字节数组转换为短裤。代码抛出此运行时错误并终止。

class accumlator : public boost::circular_buffer<char>
{
  public:
    boost::circular_buffer<char>::iterator index;
};

我已将迭代器初始化为指向缓冲区的开头

index 是循环缓冲区的迭代器。

boost::cb_details::iterator::reference boost::cb_details::iterator::operator*() const [with Buff = boost::circular_buffer, Traits = boost::cb_details::nonconst_traits >, boost::cb_details::iterator::reference = char&]: 断言 `m_it != 0' 失败。

我什至已经将它跟踪到文件 boost/circular_buffer/detail.hpp

断言条件检查 - 迭代器是否指向结束。 如果它指向结束,则抛出断言。

提前致谢。

【问题讨论】:

  • 我缩进、大写并修正了你的问题。请记住,您在问题上付出的努力越多,得到答案的可能性就越大。
  • 非常感谢你,我一定会努力改善我的问题表现。

标签: c++ boost circular-buffer


【解决方案1】:

您似乎没有将索引分配给值。 operator* 正在执行运行时检查以确保它指向有效(非 0)值。

【讨论】:

  • 我已经初始化索引指向循环缓冲区的开始,但是由于索引指向结束,所以抛出了断言和错误,
  • 这意味着 begin() == end()。循环缓冲区包含什么?你能遍历它并使用 begin() 和 end() 打印出内容吗?
  • 循环缓冲区包含 char 类型的数据。是的,当然数据存在于缓冲区中,我也已将它们流式传输到文件中。
  • 这意味着您需要发布更多代码或给出最简单的失败示例。检查 circular_buffer 代码,只有当 empty() 调用返回 true 时 begin() 才能返回 0 迭代器。那么当你将 index 设置为 begin() 时,你可以测试 empty() 吗?
  • 非常感谢你 akhisp 抛出异常是因为我们当时在构造函数中初始化索引缓冲区是空的,所以它返回 0.所以当我在函数中使用它时抛出错误,谢谢非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多