C++ 迭代std::set时出现分段错误<;标准::字符串>;在C++;

C++ 迭代std::set时出现分段错误<;标准::字符串>;在C++;,c++,iterator,segmentation-fault,set,C++,Iterator,Segmentation Fault,Set,这部分代码(for)给了我一个分段错误。源代码是可用的 我知道这个设计不是最好的,但我正在尝试实现这个项目的检查表,它涵盖了面向对象编程的各个领域。清单也可以在github上找到 我试图通过调试器运行代码,打印出*sit。它工作了一段时间,然后崩溃了。我对gdb了解不多。StackOverflow有几个“什么是分段错误?”风格的问答: 理想情况下,您是在一个具有调试器的环境中工作的,并且能够逐行遍历代码或放置断点。这可以帮助您隔离崩溃周围的环境。堆栈跟踪中已经有一个行号——我们假设它指向一个冒

这部分代码(for)给了我一个分段错误。源代码是可用的

我知道这个设计不是最好的,但我正在尝试实现这个项目的检查表,它涵盖了面向对象编程的各个领域。清单也可以在github上找到

我试图通过调试器运行代码,打印出*sit。它工作了一段时间,然后崩溃了。我对gdb了解不多。

StackOverflow有几个“什么是分段错误?”风格的问答:

理想情况下,您是在一个具有调试器的环境中工作的,并且能够逐行遍历代码或放置断点。这可以帮助您隔离崩溃周围的环境。堆栈跟踪中已经有一个行号——我们假设它指向一个冒烟的枪:

cout<<*sit<<endl;
…分为:

set<string> deps = pkg->getDependencies();
for(set<string>::iterator sit = deps.begin(); sit!=deps.end(); ++sit) { ... }
set deps=pkg->getDependencies();
对于(set::iterator sit=deps.begin();sit!=deps.end();++sit){…}
…或者您可以更改getDependencies的定义以返回引用:

set<string>& ConcretePackage::getDependencies() {
    return dependencies;
}
set&ConcretePackage::getDependencies(){
返回依赖项;
}
研究以这种方式与另一种方式做这件事的原因是留给学生做练习的P


还有几点注意:

  • 对于要使用迭代器的集合类,不需要针对零大小的特殊情况测试。如果一个集合不包含任何元素,那么该集合的
    .begin()
    将返回一个迭代器,该迭代器等于
    .end()
    。上面的循环可以很好地处理这种情况,并且会立即退出

  • 在代码中显式调用
    操作符+
    ,而不使用返回值,这表明您可能有某种副作用。很少有人期望像
    a=b+c
    这样的表达式改变
    b
    c
    …和像
    b->operator+(c)这样的一行代码表示您正在做类似的事情。虽然技术上可行,但我会避免。参见此处第2点:

  • 当您发布代码示例时,请尝试保持其可读性,而不需要显示大量滚动条。如果您在预览中注意到它放置了一个长的水平滚动条,请将行打断。不要为每个支撑使用单独的线,而是将它们放在与条件相同的线上。(无论您在代码库中使用何种约定,在线请求技术帮助时越简短越好。)

(还要提供上下文。如果你不说这是家庭作业和你自己的设计,那么像我这样的人会去谷歌搜索,试图找出你使用的是哪种包管理器。幸运的是我找到了你的程序员。stackexchange.com post…

StackOverflow有一些“什么是分段错误?”风格的问答:

理想情况下,您是在一个具有调试器的环境中工作的,并且能够逐行遍历代码或放置断点。这可以帮助您隔离崩溃周围的环境。堆栈跟踪中已经有一个行号——我们假设它指向一个冒烟的枪:

cout<<*sit<<endl;
…分为:

set<string> deps = pkg->getDependencies();
for(set<string>::iterator sit = deps.begin(); sit!=deps.end(); ++sit) { ... }
set deps=pkg->getDependencies();
对于(set::iterator sit=deps.begin();sit!=deps.end();++sit){…}
…或者您可以更改getDependencies的定义以返回引用:

set<string>& ConcretePackage::getDependencies() {
    return dependencies;
}
set&ConcretePackage::getDependencies(){
返回依赖项;
}
研究以这种方式与另一种方式做这件事的原因是留给学生做练习的P


还有几点注意:

  • 对于要使用迭代器的集合类,不需要针对零大小的特殊情况测试。如果一个集合不包含任何元素,那么该集合的
    .begin()
    将返回一个迭代器,该迭代器等于
    .end()
    。上面的循环可以很好地处理这种情况,并且会立即退出

  • 在代码中显式调用
    操作符+
    ,而不使用返回值,这表明您可能有某种副作用。很少有人期望像
    a=b+c
    这样的表达式改变
    b
    c
    …和像
    b->operator+(c)这样的一行代码表示您正在做类似的事情。虽然技术上可行,但我会避免。参见此处第2点:

  • 当您发布代码示例时,请尝试保持其可读性,而不需要显示大量滚动条。如果您在预览中注意到它放置了一个长的水平滚动条,请将行打断。不要为每个支撑使用单独的线,而是将它们放在与条件相同的线上。(无论您在代码库中使用何种约定,在线请求技术帮助时越简短越好。)


(还要提供上下文。如果你不说这是家庭作业和你自己的设计,那么像我这样的人会去谷歌搜索,试图找出你使用的是哪种包管理器。幸运的是我找到了你的程序员。stackexchange.com post…

什么是
系统->操作员+()
?@GregHewgill从stacktrace中可以看到,错误来自
PackageManager::install_package
中的
operator@GregHewgill:我已将链接添加到我在github的repo。@Drahakar:我已添加重载运算符的定义。还有,你如何从stacktrace推断出事情。我也想这样做。什么是
system->operator+()
?@GregHewgill从stacktrace中可以看到,错误来自
PackageManager::install_package
operator@GregHewgill:我已将链接添加到我在github的repo。@Drahakar:我已添加重载运算符的定义。还有,你如何从stacktrace推断出事情。我也想这样做。你是对的,我应该提供上下文。我正在
set<string>& ConcretePackage::getDependencies() {
    return dependencies;
}