rob*_*ert 3 c++ queue stl segmentation-fault
通过将java程序转换为c ++来学习C++的新手.以下代码在执行时会导致分段错误(SIGSEGV).
//add web page reference to pages queue (STL)
void CrawlerQueue::addWebPage(WebPage & webpage) {
pagesBuffer.push(webpage);
}
//remove and return web page reference from pages queue
WebPage & CrawlerQueue::getWebPage() {
if (pagesBuffer.size() > 0) {
WebPage & page = pagesBuffer.front();
pagesBuffer.pop();
return page;
} else
throw "Web pages queue is empty!";
}
//code that results in segmentation fault when called
void PageParser::extractLinks(){
try {
WebPage & page = crawlerqueue.getWebPage();
}catch (const char * error) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
修复了上述修复分段错误问题的代码的更改(<====):
//return a const WebPage object instead of a WebPage reference
const WebPage CrawlerQueue::getWebPage() { <====
if (pagesBuffer.size() > 0) {
WebPage page = pagesBuffer.front(); <====
pagesBuffer.pop();
return page;
} else
throw "Web pages queue is empty!";
}
//no segmentation fault thrown with modifications
void PageParser::extractLinks(){
try {
WebPage page = crawlerqueue.getWebPage(); <====
}catch (const char * error) {
return;
}
}
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?我仍在尝试理解引用和指针
pagesBuffer.pop();
Run Code Online (Sandbox Code Playgroud)
此行无效您的参考.
请记住,标准容器使用值而不是"引用",因此当您使用对它的引用添加对象时,实际上您在容器中添加了对象的副本.
然后使用pop(),您将销毁此对象,使指向它的任何引用或指针无效.
也许你应该存储(共享)指针而不是对象.
| 归档时间: |
|
| 查看次数: |
3725 次 |
| 最近记录: |