【发布时间】:2011-11-29 07:55:24
【问题描述】:
我的这部分代码(用于this project)给了我一个分段错误。源代码在here.
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 上找到。
我尝试通过调试器运行代码,打印出 *sit。它工作了一段时间然后崩溃。我对gdb了解不多。
【问题讨论】:
-
什么是
system->operator+()? -
@GregHewgill 从我在堆栈跟踪中看到的内容来看,错误来自
operator<<ofstd::ostream中的PackageManager::install_package。好像在for循环中。 -
@GregHewgill :我已将链接添加到我在 github 上的仓库。
-
@Drahakar :我添加了重载运算符的定义。另外,您如何从堆栈跟踪中推断出事情。我也希望能够做到这一点。
标签: c++ iterator segmentation-fault set