Priority_queue问题内存访问

时间:2013-03-29 06:26:56

标签: c++ function memory priority-queue

我的代码存在一些问题。

似乎我无法仅在特定功能中访问优先级队列的顶部。

我收到此错误:

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

1 个答案:

答案 0 :(得分:0)

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

鉴于你没有发布主要的(...)或你如何管理消息的生命周期我建议将消息​​更改为std :: shared_ptr - 这有望使你的问题消失。它还可以确定何时可以将消息删除为非问题。