У меня есть эта структура в моем коде. Компилируемая часть кода:
#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;
}
Когда я устанавливаю все параметры (кроме "string") - все хорошо и работает. Но когда я пытаюсь инициализировать 'string' parametr (или другой тип вместо этого, для типа ex myClass или другого типа), у меня есть ошибка
"Unhandled exception at 0x0FDEEAD0 (msvcr110d.dll) in ConsoleApplication1.exe:
0xC0000005: Access violation when writing to the address 0xCDCDCDCD."
Я не понимаю, почему не работает "defaultParams-> path = defaultPath". Может кто-нибудь объяснить?
Вы используете malloc для структуры со строкой std: C++ в ней
malloc ничего не знает о конструкторах, поэтому ваша строка не будет инициализирована.
вместо этого используйте new/delete и избегайте использования malloc/free в вашей программе C++
params* defaultParams = new params;
или предпочтительно
std::unique_ptr<params> defaultParams(new params);
Я думаю, что с malloc может быть что-то не так. Поскольку malloc просто выделяет некоторую память для объекта. Строка в вашем коде может превысить границу выделенной памяти. Таким образом, есть нарушение прав доступа.
Попробуйте использовать новый вместо malloc.
здесь вы используете класс реестра obj, который инициализирует значение второй obj, вы не можете инициализировать obj без использования перегрузки оператора присваивания. сначала вы должны перегрузить назначение.
work
является (нестатической) локальной переменной ...malloc()
не очень хорошо работает в C ++, он не вызывает конструкторы. Так что простое невинно выглядящее назначение может заставить вашу программу попытаться освободить мусор ...