Priority_queue problems Memory access

Priority_queue problems Memory access

本文关键字:Memory access problems queue Priority      更新时间:2023-10-16

我的代码有一些问题。

似乎只能在特定函数中访问优先级队列的顶部。

我得到这个错误:

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

让我用一个例子更清楚一点:

如果我输入

cout << *nameofmyqueue->top() ;在一个叫做firstFunction的函数中,它会完美地工作。但如果我在otherFunction中使用它,我会得到一个访问内存错误。这是我的代码:(这里有注释,它工作,哪里不)

没有问题

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;
}`

不是真正的答案,但更多的是一个建议,希望能解决你的问题。

鉴于您没有发布主(…)或您如何管理消息的生命周期,我建议将消息更改为std::shared_ptr -这将有希望使您的问题消失。它还可以使确定何时可以删除消息成为一个无关紧要的问题。