Структура Init с помощью std :: wstring - PullRequest
2 голосов
/ 25 ноября 2008

У меня есть следующая структура:

typedef struct
{
    std::wstring DevAgentVersion;
    std::wstring SerialNumber;

} DeviceInfo;

Но когда я пытаюсь использовать его, я получаю всевозможные ошибки выделения памяти.

Если я попытаюсь передать его в функцию, подобную этой:

GetDeviceInfo(DeviceInfo *info);

Я получу ошибку проверки во время выполнения, в которой будет жалоба на то, что я не инициализировал ее перед использованием, что я, похоже, исправил с помощью:

DeviceInfo *info = (DeviceInfo*)malloc(sizeof(DeviceInfo));

Но затем в функции, когда я пытаюсь установить одну из структурных строк, он жалуется, что я пытаюсь получить доступ к неверному указателю при попытке установить значение для строки.

Каков наилучший способ инициализации этой структуры (и всех ее внутренних строк?

Ответы [ 3 ]

9 голосов
/ 25 ноября 2008

Вы должны использовать new вместо malloc, чтобы убедиться, что конструктор вызывается для DeviceInfo и его содержимого wstring s.

DeviceInfo *info = new DeviceInfo;

В общем, лучше избегать использования malloc в C ++.

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

Редактировать: Конечно, если вам нужен только info в локальной области, вы не должны размещать его в куче. Просто сделайте это вместо:

DeviceInfo info; // constructed on the stack
GetDeviceInfo( &info ); // pass the address of the info
1 голос
/ 25 ноября 2008

Добавить функцию в структуру:

struct DeviceInfo
{
    std::wstring DevAgentVersion;
    std::wstring SerialNumber;
    WhatEverReturnType GetDeviceInfo() {
        // here, to your calculation. DevAgentVersion and SerialNumber are visible.
    }
};

DeviceInfo d; WhatEverReturnType e = d.GetDeviceInfo();

Обратите внимание на имя typedef struct {...}; шаблон не требуется в C ++. Если вам по какой-то причине нужно использовать бесплатную функцию для этого, используйте ссылку:

WhatEverReturnType GetDeviceInfo(DeviceInfo &info) {
    // do your calculation. info.DevAgentVersion and info.SerialNumber are visible.
}

DeviceInfo d; WhatEverReturnType e = GetDeviceInfo(d);
1 голос
/ 25 ноября 2008

std :: wstring создает объект, и объекты должны быть построены. Используя malloc, вы обошли конструктор для своей структуры, которая включала бы конструкторы для всех членов.

Ошибка, которую вы получаете от std :: wstring, пытающейся использовать один из его собственных членов, который все еще не инициализирован.

Вы можете использовать new вместо malloc, но, вероятно, лучшее решение - использовать локальную временную переменную и передать ее адрес функции.

DeviceInfo info;
GetDeviceInfo(&info);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...