sud03r
sud03r

Reputation: 19759

What is wrong with using a static member object with a class?

I have heard that using static member objects is not a very good practice.

Say for example, I have this code:

class Foo {
...
static MyString str;
};

I define and initialize this variable in the implementation file of this class as:

MyString Foo::str = "Some String"; // This is fine as my string API handles this.

When I run this code, I get a warning:

warning:'Foo::str' requires global construction.

I have quite much of such members in my class, what is the best way to handle this.

Thanks,

Upvotes: 7

Views: 552

Answers (4)

Chubsdad
Chubsdad

Reputation: 25497

As an example, it is required to know the number of instances of a class. This would require a class static member to track the count of instances.

There is nothing wrong in having a static member of a class if the problem solution requires such a design. It's just that the nitty gritties have to be taken care as mentioned in other posts.

Upvotes: 1

aschepler
aschepler

Reputation: 72356

The biggest reason for concern with this example is that constructing the static member object happens before main() and destruction happens after main() (or when you call exit()). So far, that's a good thing. But when you have multiple objects like this in your program, you risk a bug where code attempts to use an object that has not yet been constructed or has already been destroyed.

The C++ FAQ Lite has some helpful discussion on this topic, including a workaround/solution. Recommended reading is questions 10.14 through 10.18. 10.17 is most directly applicable to your example.

Upvotes: 3

Yakov Galka
Yakov Galka

Reputation: 72479

Most of the arguments against them are the same as for global variables:

  1. Initialization order between different compilation units is undefined.
  2. Initialization order inside one compilation unit may affect the behavior — thus non trivial ordering may be required.
  3. If a constructor throws an exception you can't catch it, your program is terminated.

APPENDED: To handle this properly you must either make sure that above points don't apply to your code and ignore the warning, or redesign your program: Do you really need them static? Why not use const char* Foo::str = "Some String";?

Upvotes: 10

t0mm13b
t0mm13b

Reputation: 34592

Using a static member, you are not guaranteeing thread safety, imagine two threads trying to access the static member - now what would be the value of that member - was it the one from thread x or thread y, this also induces another side-effect, race conditions, where one thread modifies the static member before the other thread completes... in other words, using a static member can be hazardous...

Upvotes: 2

Related Questions