我的代码的这一部分(对于this project)给了我一个分段错误。源代码可用here。在C++中迭代std :: set <std::string>时出现分段错误
void PackageManager::install_package(string pname)
{
if(repository->exists_package(pname)) {
Package *pkg;
ConcretePackage *cpkg;
MetaPackage *mpkg;
if(repository->is_virtual(pname)) {
//code for dealing with meta packages
mpkg = new MetaPackage(pname);
pkg = mpkg;
system->operator+(pname);
} else {
//code for dealing with concrete packages
cpkg = new ConcretePackage(pname);
pkg = cpkg;
system->operator+(pname);
if(cpkg->getDependencies().size() > 0) {
for(set<string>::iterator sit = pkg->getDependencies().begin();
sit!=pkg->getDependencies().end(); ++sit) {
cout<<*sit<<endl;
system->operator+(*sit);
}
}
}
} else {
cout<<"Invalid Package Name"<<endl;
}
}
这是我运行gdb和回溯时的错误。
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b6db03 in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)()
from /usr/lib/libstdc++.so.6
(gdb) backtrace
#0 0x00007ffff7b6db03 in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)()
from /usr/lib/libstdc++.so.6
#1 0x00000000004052e8 in PackageManager::install_package (this=0x7fffffffe280, pname=...) at packagemanager.cpp:39
#2 0x000000000040575a in main() at packagemanager.cpp:79
我想遍历一组并执行一些操作。如果需要,我可以推送更多的代码。 如果有人能指导我到一个能够学会理解这些段错误的地方,我还会喜欢它。我对他们了解不多,当我遇到这些时我倾向于恐慌。
这是System类的operator +。
void System::operator+(string pname)
{
installed_packages.insert(pname);
log.push_back("Added " + pname);
}
我知道这个设计是不是最好的,但我想实现一个清单的这个项目,它涵盖面向对象编程的各个领域的项目。该清单也可在github上获得。
我试图通过调试器运行代码,printng out * sit。它有一段时间,然后崩溃。我不太了解gdb。
什么是'system-> operator +()'? – Drahakar
@GregHewgill从我在堆栈跟踪中可以看到的错误来自'Packaged :: :: install_package'在'std :: ostream'的'operator <<'中。看起来像是在for循环中。 – Drahakar
@GregHewgill:我在github上添加了我的回购链接。 – nikhil