alanc10n
alanc10n

Reputation: 5087

std::string in struct - Copy/assignment issues?

Suppose I have a struct containing a std::string, like this:

struct userdata{
        int uid;
        std::string username;
    }

Do I need to create a copy ctor or anything to return it from a function or to use it inside a STL container? Consider this function:

userdata SomeClass::GetUserData(unsigned int uid)
{
    //do error checking and other stuff...
    //m_usermap is std::map<unsigned int, userdata>
    return m_usermap[uid];
}

When I insert userdata structs into the std::map, a copy of the struct gets created, right? Does a new std::string get created using the value of the username field, or does some sort of bitwise copy happen (this would be bad)? Similarly, when I return a userdata struct from the GetUserData method, does it have an independent string holding the username or do I need to define a copy ctor and explicitly create a new string?

Upvotes: 7

Views: 18016

Answers (4)

Jagannath
Jagannath

Reputation: 4025

As long as you don't have pointers as your datamembers, you should be fine.

Upvotes: 2

Daniel Yankowsky
Daniel Yankowsky

Reputation: 7016

std::strings by themselves can be copied without any problems.

When you define a class (or struct), C++ will generate a number of methods for you by default, including a copy constructor and an assignment operator. I believe that the generated copy constructor will call the copy constructor on each of fields, and the generated assignment operator will call the assignment operator on each of the fields. As your userdata struct is copied, std::string's copy constructor will be called for the username field.

The STL containers and algorithms should use some combination of the copy constructor and the assignment operator, so this should all be fine.

Upvotes: 4

alemjerus
alemjerus

Reputation: 8268

std::string is reference-counted, and its copy constructor takes place. So nothing to worry about. Everything is handled correctly.

Upvotes: 0

bmargulies
bmargulies

Reputation: 100133

You don't have to do anything special. C++ (and the implementation of STL) define this to just work.

Upvotes: 11

Related Questions