Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++: Do static primitives become invalid at program exit?

Assume I have a function like this:

MyClass &MyFunction(void)
{
  static MyClass *ptr = 0;
  if (ptr == 0)
    ptr = new MyClass;
  return MyClass;
}

The question is at program exit time, will the ptr variable ever become invalid (i.e. the contents of that ptr are cleaned up by the exiting process)? I realize that this function leaks, but it is only an example for simplicity.

The same question also applies to other primitives besides pointers as well. How about if I have a static integer, does the value of that integer always persist throughout exit or is variable due to static destruction order issues?

EDIT:

Just to clarify, I want to know what actually happens to the contents of the static pointer (or any other primitive type like an int or a float) and not to the memory it is pointing to. For instance, imagine that the ptr points to some memory address which I want to check in the destructor of some other static class. Can I rely on the fact that the contents of the ptr won't be changed (i.e. that the pointer value won't be cleaned up during the static destruction process)?

Thanks, Joe

like image 546
Joe Corkery Avatar asked Dec 04 '22 16:12

Joe Corkery


2 Answers

When you process exits the all memory pages allocated to it will be freed by the OS (modulo shared memory pages that someone else may be using).

However, as others point out the destructor for MyClass is never called. Nor is the value pointed to by ptr ever changed. If you have a static int with the value 123 then its value will stay 123 through to the very end of the process' lifetime.

like image 188
Rob Walker Avatar answered Dec 14 '22 11:12

Rob Walker


In modern operating systems, all of an application's memory is allocated on a "heap" specific to that application. When the application exits, all of the memory in that heap will be freed.

So, the memory will be deallocated, but: the destructor for MyClass will never be called. This can be an issue if the destructor is responsible for releasing any non-memory resources (file system locks are a common example).

like image 39
e.James Avatar answered Dec 14 '22 10:12

e.James