Hugs
Hugs

Reputation: 95

Unable to print a vector of pointers

We have some classes, class A that have a constructor that looks like this:

A::A(int num, bool boods, double diablo, std::vector<ClassB* > &c) {
    createobj();
    setNum(num);
    setboods(boods);
    setDiablo(diablo);
    c= this->c;  //Where c, is just a vector of pointer objects of class B
}

void A::createobj() {
    E e("e", 59, 0, 100);  //Where E is a derived class inherited from class B
    B *e = &e;
    c.push_back(e); 
}

//Then over at main:

main() {
    std::vector<ClassB* > c;
    A a(100, true, 1.21, c);

    std::cout << c.size();  //prints out 1 as expected...

    for(auto i : c){
        std::cout << i->getName() << std::endl; //instead of printing "e"
                                                //I get this from the console 
                                                //�
                                                //Segmentation Fault
    }
}

I have been working on this for over 12 hours, any help is greatly appreciated and I will dance at your wedding.

c vector is a private vector of pointers that was declared in class A's .h and only holds ClassB* objects.

Upvotes: 0

Views: 127

Answers (1)

PaulMcKenzie
PaulMcKenzie

Reputation: 35455

This is an issue:

void A::createobj(){
    E e("e", 59, 0, 100);  
    B *e = &e;   // <-- Is this your real code?  Anyway, the next line is bad also
    c.push_back(e);  // <-- The e is a local variable
}

You are storing pointers to a local variable e, thus when createobj returns, that e no longer exists.

One solution is to dynamically allocate your objects, and then you need to manage their lifetimes correctly by deallocating the memory somewhere in your code by issuing calls to delete:

void A::createobj(){
    E* e = new E("e", 59, 0, 100);  
    c.push_back(e);  // <-- ok 
}

Upvotes: 1

Related Questions