复制的 std::list 中的垃圾

2024-03-03

我的图形类看起来像:

class Graph {
  public:
    typedef unsigned int size_type;
    typedef std::list<size_type> Neighbours;

  protected:
    size_type m_nodes_count, m_edges_count;

  public:
    Graph(size_type nodes_count = 0) :
      m_nodes_count(nodes_count), m_edges_count(0) {}

    virtual bool is_edge(size_type from, size_type to) = 0;
    virtual Neighbours neighbours(size_type node) = 0;

    virtual Graph& add_edge(size_type from, size_type to) = 0;
    virtual void delete_edge(size_type from, size_type to) = 0;

    size_type nodes_count() { return m_nodes_count; }
    size_type edges_count() { return m_edges_count; }

    virtual ~Graph() {}
};

class AdjList : public Graph {
  private:
    typedef std::list<size_type> Row;
    std::vector<Row> m_list;

  public:
    AdjList(size_type nodes_count) : Graph(nodes_count) {
      m_list.resize(nodes_count);
    }

    AdjList(const AdjList& g) : AdjList(g.m_nodes_count) {
      for (int i = 0; i < nodes_count(); i++)
        std::copy(g.m_list[i].begin(), g.m_list[i].end(), std::back_inserter(m_list[i]));
    }

    virtual bool is_edge(size_type from, size_type to) override {
      return std::find(m_list[from].begin(), m_list[from].end(), to) != m_list[from].end();
    }

    virtual Graph& add_edge(size_type from, size_type to) override {
      if (!is_edge(from, to) && !is_edge(to, from)) {
        m_list[from].push_back(to);
        m_list[to].push_back(from);
        m_edges_count++;
      }

      return *this;
    }

    virtual void delete_edge(size_type from, size_type to) override {
      m_list[from].remove(to);
      m_list[to].remove(to);
      m_edges_count--;
    }

    virtual Neighbours neighbours(size_type node) {
      return m_list[node];
    }
};

但当我试图得到graph.neighbours(v)我里面有大量垃圾:

(gdb) p graph
$1 = {<Graph> = {_vptr.Graph = 0x406210 <vtable for AdjList+16>, m_nodes_count = 3, m_edges_count = 3}, m_list = std::vector of length 3, capacity 3 = {std::list = {[0]
 = 2, [1] = 1},
    std::list = {[0] = 0, [1] = 2}, std::list = {[0] = 0, [1] = 1}}}
(gdb) p graph.neighbours(0)
$2 = std::list = {[0] = 2, [1] = 1, [2] = 4294956560, [3] = 2, [4] = 1,
  [5] = 4294956560, [6] = 2, [7] = 1, [8] = 4294956560, [9] = 2, [10] = 1,
  [11] = 4294956560, [12] = 2, [13] = 1, [14] = 4294956560, [15] = 2,
  [16] = 1, [17] = 4294956560, [18] = 2, [19] = 1, [20] = 4294956560,
  [21] = 2, [22] = 1, [23] = 4294956560, [24] = 2, [25] = 1,...

如何解决这个问题?


gdb可能会感到困惑实施细节 the std::list。例如。老人SGI STL list http://www.sgi.com/tech/stl/stl_list.h被实施为循环列表。在 - 的里面list对象,只有一个_List_node<_Tp>指针称为_M_node。构造函数将内部_M_next最终节点元素的指针等于_M_node本身。

标准库实现的原因std::list使用这种循环实现是为了避免最终元素的特殊情况(例如,他们也可以使用带有 a 的哨兵元素nullptr下一个指针)。马特·奥斯汀有一个不错的ACCU演示 http://www.accu-usa.org/Slides/SinglyLinkedLists.ppt关于此(但链接当前指向损坏的文件,请参阅存档版本在这里 http://web.archive.org/web/20090618135116/http://www.accu-usa.org/Slides/SinglyLinkedLists.ppt).

这个循环实现解释了为什么你的gdb输出为g.neighbors()具有重复模式[0] = 2, [1] = 1, [2] = 4294956560, /* etcetera */。值 4294956560 只是内部的内存地址_M_node你的变量std::list, so if gdb只做简单的指针追逐,它会变得混乱。请注意,它小于2^32,即您可能正在针对 32 位进行编译。

您可能应该自己验证这一点<list>系统上标准库的标头。错误报告gdb也可能是有序的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制的 std::list 中的垃圾 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 使用 CSharpCodeProvider 类编译 C# 7.3 的 C# 编译器版本是什么?

    我想使用 Microsoft CSharp CSharpCodeProvider 类来编译 C 7 3 代码 编译器版本在 IDictionary 中指定 在创建新的 CSharpCodeProvider 时将其作为输入 例如 Compil
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop

随机推荐

  • Google 地图可以设置为缓慢持续平移吗?就像一场全球革命?

    正如标题所说 我正在寻找解决方案 但没有找到任何可以引导我找到正确文档或文章的内容 如果您有任何想法或可以向我指出一个可以使用的可能解决方案 我将不胜感激 Thanks 你可以自己这样做 Use setInterval https deve
  • OpenGL 实现多通道

    我在移植一些已成功实现的代码时遇到问题着色玩具 https www shadertoy com view XdyfWK对于桌面 OpenGL 问题是我需要创建一个 FrameBufferObject FBO 以便我可以进行离屏计算 稍后将其
  • VB.NET ArrayList 到 List(Of T) 类型复制/转换

    我有一个返回旧式 ArrayList 的第 3 方方法 我想将其转换为类型化 ArrayList Of MyType Dim udc As ArrayList ThirdPartyClass GetValues Dim udcT AS Li
  • 如何获取特定日期的唯一客户和重复客户每天的客户数量?

    我试图从我的订单表中获取结果 以获取第一次订购和重复订单的客户数量列表 像下面这样的东西 Date 1st time time repeat order 2014 09 01 43 90 2014 09 02 3 45 2014 09 03
  • 由于 ISAPI 报告不健康状况,ASP Net Core 应用程序被回收

    我收到系统事件日志条目 An ISAPI reported an unhealthy condition to its worker process Therefore the worker process with process id
  • .NET 生产代码中的“Assert”语句

    离开是否明智Trace Assert and Debug Assert代码中的语句是否 稳定 并且已移至测试和生产环境中 如果是这样 这些断言语句有何帮助 让 Guard 类等检查异常情况并适当引发异常还不够吗 调试断言 http msdn
  • MYSQL:带有 if 语句的过程

    我正在尝试制定一个例程 首先检查用户密码 如果正确 它将从不同的表返回一些值或连续更改一些值 如果不进行在 PHP 中处理的两个查询 这是否可能 首先要求输入密码 检查密码是否正确 然后允许用户更改名称 下面是使用电子邮件和密码获取用户中的
  • SCRIPT5:由于 Wordpress 中的 jQuery.min CDN 文件,IE9 上的访问被拒绝

    我读过很多关于 SCRIPT5 IE9 中的访问被拒绝问题的其他文章 但据我所知 这篇文章有点不同 我不太确定为什么会发生这种情况 使用标准 2011 主题安装 Wordpress 3 4 1 时会出现这种情况 我使用以下函数将脚本排入队列
  • Bash 脚本中的反引号和 $() 有什么区别? [复制]

    这个问题在这里已经有答案了 我在 Bash 脚本中看到两种不同的形式 它们的作用似乎相同 some command and some command 两者有什么区别 什么时候应该使用它们 没有任何语义差异 反引号语法是较旧且功能较弱的版本
  • 如何正确使用 Alexa Skill 中的异步函数?

    我对异步编程非常陌生 所以请原谅我缺乏理解 但我目前正在构建一个调用私人停车 API 的 Alexa 技能 您可以调用该API 它会为您提供最近的停车位 const getParkingSpots Handler canHandle han
  • 如何设置夜间模式绘图以按预期工作

    我如何随着夜间模式的变化而改变背景 我有 values 和 values night 文件夹 其中包含具有不同值的 colors xml
  • 了解 MVC 中的模型类与数据类

    多年来我一直使用 Webforms 开发 ASP Net 应用程序 并且完成了一些 MVC 应用程序 但从未真正完整地使用过该框架 这是由于大多数项目的时间限制 虽然 我使用的是 MVC 结构 但我仍然使用旧的方法 即不使用 Html Be
  • ggplot2图例不出现的原因[重复]

    这个问题在这里已经有答案了 我试图 失败 在我的 R ggplot2 图中显示一个涉及多个图的图例 我的数据框df代码如下 Individuals Mod 2 Mod 1 Mod 3 1 2 0 013473145 0 010859793
  • php 只处理第一个空白的爆炸函数

    我有一个字符串Hello This is a String 我只需要在 PHP 中将其分解为第一个White Space 这怎么可能 set limit范围 print r explode str 2 Reference http php
  • SQL Server 碎片问题

    我的数据库中有几个表 User 和 UserRecord 它们变得极其碎片化 例如 99 导致整个数据库以及网站陷入瘫痪 UserRecord 有点像该用户在某个时间点的快照 用户就像该用户的主记录 用户有 0 到多个 UserRecord
  • 自定义 STL 序列的最小嵌套 typedef 集?

    应在满足序列概念的自定义 STL 类中定义的最小嵌套 typedef 集是什么 自定义序列应兼容 std back insert iterator http www sgi com tech stl front insert iterato
  • 从 Apple Developer Portal 中删除开发者证书

    我错误地在我的 Apple 开发者帐户上创建了开发者证书 现在我想从门户中删除它 但我不喜欢任何方法来删除它 您能给我一个如何从苹果开发者门户删除证书的想法 建议吗 如果您错误地创建了证书或者想要重置证书 您可以从 Apple Develo
  • 如何连接位置数据(纬度、经度)

    我必须数据集 一个包含某个位置 经纬度 即测试 另一个包含纽约市所有邮政编码的纬度 经度信息 即 test2 test lt structure list trip count 1 10 dropoff longitude c 73 959
  • AWS Lambda 无法删除 Amazon S3 对象

    我正在尝试创建一个 AWS Lambda 函数 该函数处理上传到第一个存储桶的文件 然后将其保存到第二个存储桶 然后删除输入文件 问题是 当我尝试删除文件时 我得到了 message Access Denied code AccessDen
  • 复制的 std::list 中的垃圾

    我的图形类看起来像 class Graph public typedef unsigned int size type typedef std list