Я был очень удивлен, увидев, что в версии Visual C ++ что идет с VS2013 члены данных недавно созданного класса, кажется, автоматически инициализируются 0 или же ноль в зависимости от их типа. Это новое и очень полезное! — поведение в моем опыте. Я ранее только использовал VC ++ версия 4 при написании серьезных приложений и еще в середине 1990-х начальные значения были эксплицитно указано как неопределенное / случайное.
Возможно, это полезный атрибут использования библиотек отладки, или можно постоянно полагаться на нулевую инициализацию?
Как и просили, некоторые примеры кода — ничего страшного, я боюсь:
class CData
{
public:
CData();
CData(const CData ©);
~Data();
const CData& operator=(const CData ©);
//Accessors/Mutators follow...private:
bool Initialize_Data();
//Just giving a couple of examples of data member sets.
char *input_script_name;
int size_input_script_name;
int size_input_script_name_buffer;
char *interpreter_name;
int size_interpreter_name;
int size_interpreter_name_buffer;
};
CData::CData()
{
Initialize_Data();
}
CData::~CData()
{
//Code to store relevent data in registry
//and then free dynamically allocated memory follows...
}
bool CData::Initialize_Data()
{
//Code to retrieve data from registry stored at end of last run follows
//along with routines to check bounds.
//
//At this point, without executing any further a breakpoint is triggered
//and on inspecting data members in a Watch on 'this' I find them
//to be already initialized to either 0 or null respectively.
}
...
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//Application entry point;
CData application_data; //and away it goes!
//Usual name mutex to prevent multiple instances and message loop follow...
}
Как я уже сказал, ОЧЕНЬ базовый, и я не иллюстрирую весь код. Тем не менее, в момент достижения точки останова в Initialize_Data, то есть непосредственно при создании класса и ДО выполнения чего-либо еще, все элементы данных отображаются как 0 или ноль в наблюдении. Что довольно удивительно!
Это просто совпадение. Вероятно, вы заметили, что что-то очищает много памяти непосредственно перед инициализацией вашего объекта, а затем ваш объект помещается в эту инициализированную нулем память. Нет гарантии, что это так и останется, и вы не сможете полагаться на это на других платформах / компиляторах. В режиме отладки Visual C ++ фактически пытается очистить, например, ненулевой битовый шаблон.
Если вы хотите обнулить инициализацию, вы можете использовать нестатические инициализаторы членов C ++ 11, например:
char *input_script_name = nullptr;
int size_input_script_name = 0;
int size_input_script_name_buffer = 0;
char *interpreter_name = nullptr;
int size_interpreter_name = 0;
int size_interpreter_name_buffer = 0;
Я не уверен, что текущие компиляторы оптимизируют это до memset
если все установлено в 0, но это путь, если у вас есть доступ к компилятору C ++ 11.
Только что проверил с Clang 3.4, он испускает memset
если все установлено в 0. GCC инициализируется с помощью регистров, но я подозреваю, что это потому, что мой маленький тестовый случай имел только ~ 10 переменных-членов.