Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ static member variable scope

The title basically says it all, i wonder when static members of a c++ class are initialized and when they go out of scope.

I need this for the following problem. I have many objects of a class Foo and each object needs access to a resource, encapsulated by another class Bar. Synchronization is not an issue, so i want all objects to share the same Bar instance.

I'm using a simple managed pointer for reference counting.

Can i do the following:

class Foo {
private:
    static managed_pointer<Bar> staticBar;
public:
    Foo() {
        if(!staticBar)
            staticBar = new Bar;
    }
    /*
     * use staticBar in various non-static member functions
     */
};

managed_pointer<Bar> Foo::staticBar = NULL;

the managed_pointer staticBar should delete the Bar object as soon as it goes out of scope - but when does this happen? when the last instance of Foo is destructed? on application exit?

Thanks for your advice!

like image 575
Pontomedon Avatar asked Jul 04 '12 13:07

Pontomedon


People also ask

What is the scope of static variable in C?

The scope of the static local variable will be the same as the automatic local variables, but its memory will be available throughout the program execution. When the function modifies the value of the static local variable during one function call, then it will remain the same even during the next function call.

Do static variables have a scope?

In terms of scope and extent, static variables have extent the entire run of the program, but may have more limited scope. A basic distinction is between a static global variable, which has global scope and thus is in context throughout the program, and a static local variable, which has local scope.

Do static members have class scope?

Static member functions have a class scope and they do not have access to the this pointer of the class. You could use a static member function to determine whether some objects of the class have been created or not.

Do static variables have global scope?

The difference between a static variable and a global variable lies in their scope. A global variable can be accessed from anywhere inside the program while a static variable only has a block scope.


2 Answers

statics and globals are initialized right before the program starts (before main is called, the program actually starts before that) and go out of scope after main exits.

Exceptions - local statics (static variables declared inside functions) and unused template class staticmembers.

It has nothing to do with the number of instances.

like image 66
Luchian Grigore Avatar answered Oct 02 '22 04:10

Luchian Grigore


The standard does not specify a precise order of initialization, it is implementation specific. They will be instantiated at the start of the program and deallocated at the end.

You have to be very careful with what you are doing, because if you have some other static objects that rely on this object to exist, it's UB. There is no telling in what order they will be initialized.

You could possibly look into something like boost::call_once to ensure it's initialized once, but I wouldn't rely on the order the statics are initialized.

For all I know, you code would work, but I've been bitten by the static initialization issue before so I wanted to warn you.

EDIT: Also in your code, when the managed_ptr will go out of scope (end of program), it will delete the memory allocated automatically. But you should not do anything non-trivial in Bar's destructor as you may trigger UB by calling into other free'd instances or even code that has been removed (as it happened to me once where a dynamic library had been removed). Essentially you are in a minefield, so watch out.

like image 27
Julien Lebot Avatar answered Oct 02 '22 05:10

Julien Lebot