0
/*
 Constructor initializing a string pointer
*/
    class Person {
    public:

        Person(string name) :pName(new string(name)) {
            //pName = new string(name);
        }
        ~Person() { delete pName; }
        void printName() { cout << *pName << endl; }
    private:
        string* pName;
    };
    
    int main() {
        vector<Person> persons;
        persons.push_back(Person("p1"));
        persons.front().printName();
        cout<<"Good bye"<<endl;
        return 0;
    }
MikeCAT
  • 73,922
  • 11
  • 45
  • 70
  • 3
    Follow [The Rule of Three](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) by adding definition of copy constructor and assignment operator to avoid troubles on copying. – MikeCAT Jun 12 '21 at 02:56
  • Please review [ask] for advice on how to write a good question. – JaMiT Jun 12 '21 at 03:07
  • Does the string variable really need to be a pointer to a string? If you had a string member instead you could use the rule of zero. – drescherjm Jun 12 '21 at 03:19

1 Answers1

1

I might not have this entirely correct but the reason this is happening is as follows.. Person("p1") creates a temporary person with a pointer to the string "p1". persons.push_back() copies that object into the vector. This is only a shallow copy so the new object's pointer will point to the memory location of the temporary object's string which gets destroyed so you're accessing invalid memory.

You can do persons.emplace_back("p1"); which creates the object in place in the vector so no copying takes place; however, as the comments point out, if you are managing memory yourself then you need to apply the rule of 3 and implement copy and assignment constructors as well as the destructor.

matdon
  • 146
  • 6