Ошибка со структурой инициализации в C ++

0

У меня есть эта структура в моем коде. Компилируемая часть кода:

#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". Может кто-нибудь объяснить?

  • 1
    Бьюсь об заклад, несколько долларов, что work является (нестатической) локальной переменной ...
  • 0
    Кроме того, IDK, как много проблем, которые могут быть, но malloc() не очень хорошо работает в C ++, он не вызывает конструкторы. Так что простое невинно выглядящее назначение может заставить вашу программу попытаться освободить мусор ...
Показать ещё 2 комментария
Теги:
struct
structure

3 ответа

0
Лучший ответ

Вы используете malloc для структуры со строкой std: C++ в ней

malloc ничего не знает о конструкторах, поэтому ваша строка не будет инициализирована.

вместо этого используйте new/delete и избегайте использования malloc/free в вашей программе C++

params* defaultParams = new params;

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

std::unique_ptr<params> defaultParams(new params);
  • 0
    да! с помощью «нового» решить мою проблему! Большое спасибо! знак равно
1

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

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

  • 0
    Спасибо! Ваши советы были очень полезны
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню