Итак, я думаю, что ваша проблема в том, что обе переменные указывают на одно и то же место в памяти. Что вы действительно говорите компилятору:
Data* tempPointer = &globaldata;
- это взять адрес globaldata и присвоить его tempPointer. Таким образом, изменяя поля tempPointer, вы меняете поля globaldata. Или, другими словами, (* tempPointer) становится псевдонимом для глобальных данных. Я вижу два варианта:
Data tempData = globaldata;
и предоставляем конструктор копирования при необходимости; Или просто:
int tempVal = globaldata.a
Кроме того, я думаю, вы, возможно, захотите познакомиться с Singleton pattern