C ++:使用指针更新到内存位置会丢失

时间:2014-08-26 12:42:32

标签: c++ pointers

代码中的两个主要类是TestVm和TestLocalQueue。 LocalQueue拥有一个队列,并提供put方法来向队列添加内容。

这是我的代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <map>
using namespace std;
class ERBaseEventType {
public:
    ERBaseEventType();
    string dynamic;
    void setDynamic(string );
    string getDynamic();
    };
ERBaseEventType::ERBaseEventType() {
}

void ERBaseEventType::setDynamic(string ndynamic){
    dynamic=ndynamic;
}
string ERBaseEventType::getDynamic(){
    return dynamic;
}

class BaseEventType : public ERBaseEventType {
public:
    BaseEventType();

};
BaseEventType::BaseEventType() {
}
class ControlCommand : public ERBaseEventType{
public:
    ControlCommand();

};
ControlCommand::ControlCommand() {

}
class LocalQueue {
    // static const int ENDLEN =100;
      string name;
      ERBaseEventType * queue[100];            // holds the queue
        int  head, tail;             // indices of head and tail
    bool lock;
    public:
        void init();                // initialize
             // store
        void put(ControlCommand * );
        void print();


};
void LocalQueue::init()
{
    head = tail = 0;
    cout<<"tail value  is "<<tail<<endl;
    cout<<"head value is "<<head<<endl;

}

void LocalQueue::put(ControlCommand * mb )
{

    if(tail+1==head || (tail+1==100 && !head)) {
    cout << "Queue is full\n";
    lock=false;
        return;
    }

    if(tail == 100)
        tail = 0; // cycle around
    queue[tail] =   mb;

    cout << "Added to the queue tail is "<<tail<<endl;
    cout << "Address is  "<<queue+tail<<endl;
        tail++;

}
void LocalQueue::print(){
    std::cout<<"\nprint  :";
    std::cout<<tail;
    for(int q=0;q<tail;q++){
        cout << "\nAddress is  "<<queue+q<<endl;
        string ntdynamicContext=queue[q]->getDynamic();
        std::cout<<ntdynamicContext;


    }
}


class TestLocalQueue {
private:
    LocalQueue * localQueue;
public:
    TestLocalQueue(LocalQueue *);
    void putMsg();
    virtual ~TestLocalQueue();
};
TestLocalQueue::TestLocalQueue(LocalQueue * lq) {
    localQueue=lq;
}
void TestLocalQueue::putMsg(){
    ControlCommand * cd =new ControlCommand;
    cd->setDynamic("alpha");
    localQueue->put(cd);
    localQueue->print(); //-----> prints the content
   // delete cd;
}
TestLocalQueue::~TestLocalQueue() {

}
class TestVM {
public:
    static LocalQueue localQueue;
    void addMessage();
    void print();
    TestVM();
    virtual ~TestVM();
};
LocalQueue TestVM::localQueue;
TestVM::TestVM() {
    localQueue.init();
    cout<<"localQueue initialized  \n"<<endl;
}
void TestVM::addMessage(){
    TestLocalQueue t(&localQueue);

    t.putMsg();
}
void TestVM::print(){
    localQueue.print();
}
TestVM::~TestVM() {
}

int main(){
    TestVM v;
    v.addMessage();
    cout<<"\nprinting from main  \n"<<endl;
    v.print();   //-----> does not print the content
}

问题:

我将引用传递给&#34; localQueue&#34;从TestVM到TestLocalQueue,并使用该引用将内容添加到localQueue(putMsg())。在TestLocalQueue中,我可以在调用print putMsg()时访问添加的内容。但是当我尝试从TestVM访问localqueue时(正如我在代码中标记的那样)我无法获取内容。

抱歉代码太多了。我试图简化它。

1 个答案:

答案 0 :(得分:2)

这很糟糕:

void TestLocalQueue::putMsg(){
    ControlCommand cc;
    cc.setDynamic("target");
    cout<<"Setting Dynamic context \n"<<endl;
   localQueue->put(&cc );

localQueue->put函数存储您将其指向队列的指针。 但cc的生命周期仅适用于putMsg函数的持续时间,因此当此函数退出时,您将有一个悬空指针。

要解决此问题,您可以让队列存储对象的副本,也可以动态分配cc