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;
}`
當你調用'envoiMessages'時,你確定你的隊列不是空的嗎?雖然我不認爲這應該是問題,考慮到例外... – Nbr44
我的水晶球和兔子腳告訴我你應該做以下事情:追蹤* Ordinateur :: addmessageAEnvoyer()的*調用者*。 (那個電話之後不久)是刪除剛剛插入隊列的消息的代碼。或者,您推送本地堆棧變量的地址,然後在範圍退出中銷燬該變量,但在其地址被推入隊列後。無論哪種方式,您的隊列中都有無效的指針。 – WhozCraig
發現了!我創建了一個稱爲消息的本地變量,而不是使用Message&,所以隊列總是清空自己..... –