c ++ STL队列,引用和分段错误

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)

是什么赋予了?我仍在尝试理解引用和指针

Kla*_*aim 5

pagesBuffer.pop();
Run Code Online (Sandbox Code Playgroud)

此行无效您的参考.

请记住,标准容器使用值而不是"引用",因此当您使用对它的引用添加对象时,实际上您在容器中添加了对象的副本.

然后使用pop(),您将销毁此对象,使指向它的任何引用或指针无效.

也许你应该存储(共享)指针而不是对象.