2013-03-29 97 views
0

我的代碼存在一些問題。Priority_queue問題內存訪問

看來我不能只在特定功能中訪問優先級隊列的頂部。

我得到這個錯誤:

Unhandled exception at at 0x77644B32 in ConsoleApplication5.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x00D7E6A8. 

讓我更加清楚一點用一個例子:

,如果我在一個叫firstFunction功能做了

cout << *nameofmyqueue->top() ;它會很好地工作。但如果我在otherFunction中使用它,我會得到訪問內存錯誤。這裏是我的代碼:(有評論在這裏它的工作原理,並在它不)

沒有probs與

void Ordinateur::addmessageAEnvoyer(Message* message){ 

沒有按牛逼工作,

void Ordinateur::envoiMessages(){ 

任何想法,爲什麼它不」工作?

非常感謝!

#ifndef _ORDINATEUR_H_ 
#define _ORDINATEUR_H_ 

#include "PrioriteMessage.h" 
#include "Reseau.h" 
#include "Message.h" 
#include <queue> 
#include<iostream> 

using namespace std; 


class Ordinateur 
{ 
public: 
    Ordinateur(); 
    Ordinateur(string nom,int adresse,Reseau* adresseReseau); 
    ~Ordinateur(); 

    int getAdresse() const; 
    string getNom()const; 
    Reseau* getAdresseReseau() const; 


    void addmessageAEnvoyer(Message* message); 
    void envoiMessages(); 
    void recoiMessages(Message* messageRecu); 
    void afficherMessagesRecus(); 
    void afficherOrdinateur(ostream& ostr); 
    friend ostream& operator<< (ostream& ostr, Ordinateur& ordinateur); 

private: 
    int adresse_; 
    string nom_; 
    Reseau* adresseReseau_; 
    priority_queue<Message*,vector<Message*>,PrioriteMessages> listMessagesAEnvoyer_; 
    vector<Message*> messagesRecus_; 
}; 

#endif 







`#include"Ordinateur.h" 

#include <queue> 


Ordinateur::Ordinateur(){ 
    nom_ = "default"; 
    adresse_ = 0; 
} 

Ordinateur::Ordinateur(string nom,int adresse,Reseau* adresseReseau){ 
    nom_ = nom; 
    adresse_ = adresse; 
    adresseReseau_ = adresseReseau; 
} 

Ordinateur::~Ordinateur() 
{ 
} 


int Ordinateur::getAdresse()const{ 
    return adresse_; 
} 
string Ordinateur::getNom()const{ 
    return nom_; 
} 
Reseau* Ordinateur::getAdresseReseau() const{ 
    return adresseReseau_; 
} 



void Ordinateur::addmessageAEnvoyer(Message* message){ 
    listMessagesAEnvoyer_.push (message); 
cout << *listMessagesAEnvoyer_.top(); // NO PRPOBLEM HERE 
} 


void Ordinateur::envoiMessages(){ 

    cout << *listMessagesAEnvoyer_.top(); // PROBLEM HERE 
    while(!listMessagesAEnvoyer_.empty()) 
    { 

     if (listMessagesAEnvoyer_.top()->getnomDestinataire()!= "0"){ 
      adresseReseau_->envoiMessageNom(*listMessagesAEnvoyer_.top(),listMessagesAEnvoyer_.top()->getnomDestinataire()); 
     } 
     else if (listMessagesAEnvoyer_.top()->getnomDestinataire() == "0") 
      adresseReseau_->envoiMessageTous(*listMessagesAEnvoyer_.top()); 

     listMessagesAEnvoyer_.pop(); 

    } 
} 

void Ordinateur::recoiMessages(Message* messageRecu){ 

    cout << nom_ << " #"<< adresse_<<" " <<" Reception d'un message.."<< endl; 
    messagesRecus_.push_back (messageRecu); 


} 

void Ordinateur::afficherOrdinateur (ostream& ostr){ 
    ostr << nom_ << " #"<< adresse_<<" "; 

} 

void Ordinateur::afficherMessagesRecus(){ 
    cout << nom_ << " #"<< adresse_<<" Affichage des messages recus ("<<messagesRecus_.size()<<"):"<<endl; 
    for (unsigned int i = 0; i < messagesRecus_.size(); i++) 
    { 
     cout << messagesRecus_[i]<<endl; 
    } 

} 




ostream& operator<<(ostream& ostr, Ordinateur& ordinateur){ 

    ordinateur.afficherOrdinateur (ostr); 
    return ostr; 
}` 
+0

當你調用'envoiMessages'時,你確定你的隊列不是空的嗎?雖然我不認爲這應該是問題,考慮到例外... – Nbr44

+0

我的水晶球和兔子腳告訴我你應該做以下事情:追蹤* Ordinateur :: addmessageAEnvoyer()的*調用者*。 (那個電話之後不久)是刪除剛剛插入隊列的消息的代碼。或者,您推送本地堆棧變量的地址,然後在範圍退出中銷燬該變量,但在其地址被推入隊列後。無論哪種方式,您的隊列中都有無效的指針。 – WhozCraig

+0

發現了!我創建了一個稱爲消息的本地變量,而不是使用Message&,所以隊列總是清空自己..... –

回答

0

不是一個真正的答案,但更多的建議,希望能解決您的問題。

鑑於您沒有發佈主要(...)或您如何管理消息的生命週期,我建議將消息​​更改爲std :: shared_ptr - 這將有望使您的問題消失。它也將決定何時可以刪除消息一個非問題。