2013-11-20 1 views
0

У меня есть эта структура в моем коде. часть «компилируется» кода:Ошибка с структурой инициализации в C++

#define MONITOR_TOPKEY HKEY_LOCAL_MACHINE 
#define MONITOR_SUBKEY TEXT("SOFTWARE\\WMyRegistry") 
struct params { 
    HKEY hMainKey; 
    LPTSTR hSubKey; 
    string path; 
    bool* runflg; 
}; 
void _tmain(void) { 
    bool work = true; 
    string defaultPath = "HKEY_LOCAL_MACHINE"; 
    defaultPath += "\\"; 
    defaultPath += MONITOR_SUBKEY; 
    params* defaultParams = (params*) malloc(sizeof (params)); 
    defaultParams->hMainKey = MONITOR_TOPKEY; 
    defaultParams->hSubKey = MONITOR_SUBKEY;  
    defaultParams->path = defaultPath; // HERE THERE IS A PROBLEM 
    defaultParams->runflg = &work; 
} 

Когда я установил все parametrs (за исключением «строка») - все это работает и работает хорошо. Но когда я пытаюсь inizialize «строка» Parametr (или другой тип вместо этого для экс типа MyClass или другой переменной типа еще) у меня есть ошибка

"Unhandled exception at 0x0FDEEAD0 (msvcr110d.dll) in ConsoleApplication1.exe: 
0xC0000005: Access violation when writing to the address 0xCDCDCDCD." 

Я не понимаю, почему doens't work "defaultParams-> path = defaultPath". Может кто-нибудь объяснить?

+1

Я держал пари несколько долларов, что 'work' является (не статический) локальный variable ... –

+0

Кроме того, IDK, какая из проблем может быть, но 'malloc()' не работает хорошо в C++, он не вызывает конструкторы. Таким образом, простое невинное видение может привести к тому, что ваша программа попытается освободить мусор ... –

+0

Также покажите нам некоторый компилируемый код, который на самом деле терпит неудачу. Вопрос слишком абстрактный, как сейчас. –

ответ

0

Вы используете таНос на структуры с C++ класс станда: струнный в нем

таНосе ничего не знает о конструкторах так что ваша строка не будет инициализирована.

вместо этого использовать новые/удалить и не использовать программу таНос/Free в вашем C++

params* defaultParams = new params; 

или предпочтительно

std::unique_ptr<params> defaultParams(new params); 
+0

да! используя «новый» решить мою проблему! Большое спасибо! знак равно –

0

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

1

Я думаю, что может быть что-то не так с malloc. Поскольку malloc просто выделяет некоторую память для объекта. Строка в коде может превышать границу выделенной памяти. Таким образом, есть нарушение прав доступа.

Попробуйте использовать новый вместо malloc.

+0

Спасибо! Ваш совет был очень полезен слишком –

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