2016-02-01 2 views
0

Давайте мне описать мою проблему. Я проанализировал следующий код, сгенерированный с помощью Visual Studio 2015 [Release] с помощью OllyDbg, а memset вызывается дважды (один раз с 408 байтами и последний с 400 байтами). Очевидно, что 408 байт - это компилятор, выполняющий нулевую инициализацию в моем классе.Это обычное поведение C++? компилятор ноль инициализирует мой класс, несмотря на наличие определенного пользователем конструктора

Почему это происходит?

У моего основного класса уже есть конструктор, который должен избавиться от созданного компилятором конструктора.

Самое смешное: если я удалю член «someotherclas sb» из основного класса, m_buffer будет установлен только один раз (по мне, с 400 байтами).

// ConsoleApplication.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 

class someotherclas 
{ 
public: 
    int * ptr; 
}; 

class mainclass 
{ 
public: 
    char m_buffer[400]; 
    someotherclas sb; //If I remove this, buffer will be memset once only (by me, in the constructor) 
    int a; 

    mainclass() 
    { 
     memset(m_buffer, 0x00, sizeof(m_buffer)); 
     a = 6; 
    } 
}; 

int main(int argc, char * arr[]) 
{ 
    mainclass * buffer2 = new mainclass; 
    return 0; 
} 
+4

Я предполагаю, что буфер должен быть m_buffer в вашем главном классе? – Goodies

+0

Я подозреваю, что в реальном коде 'new mainclass'' на самом деле 'new mainclass();'. –

+0

@Goodies - это правильно. буфер должен быть m_buffer, я сделал ошибку, которую я уже исправил. Кроме этого, весь код верен и может быть скомпилирован без каких-либо других модификаций. – Jts

ответ

6

Я думаю, это происходит потому, что для вашего проекта включены Security Development Lifecycle checks. Не могли бы вы проверить параметры компилятора? Если да, применяется следующее:

Когда/sdl включен, компилятор ... Выполняет инициализацию члена класса . Автоматически инициализирует все члены класса до нуля на объекте (до запуска конструктора). Это помогает предотвратить использование неинициализированных данных, связанных с членами класса, что конструктор явно не инициализирует.

+0

Есть ли способ уклониться от него? без его отключения? Или я должен отключить его? - Хосе 6 минут назад – Jts

+0

@Jose, я не знаю, как просто отключить обнуление без отключения всего жизненного цикла разработки безопасности. Если вы хотите отключить целое, перейдите к свойствам проекта, в дереве управления слева разверните «Свойства конфигурации», затем «C/C++», затем «Общие» и в таблице справа найдите «Проверка SDL» и установите «Нет (/ sdl-)». –

Смежные вопросы