Estrutura Init com std :: wstring
Pergunta
Eu tenho uma estrutura como segue:
typedef struct
{
std::wstring DevAgentVersion;
std::wstring SerialNumber;
} DeviceInfo;
Mas quando eu tento usá-lo eu recebo todos os tipos de erros de alocação de memória.
Se eu tentar passar para uma função como esta:
GetDeviceInfo(DeviceInfo *info);
vou receber um erro de verificação de tempo de execução reclamando que eu não inicializá-lo antes de usá-lo, o que eu parecia ter corrigido com:
DeviceInfo *info = (DeviceInfo*)malloc(sizeof(DeviceInfo));
Mas, em seguida, na função, quando eu tentar definir qualquer uma das picadas de estruturas, que se queixa de que eu estou tentando acessar um ponteiro inválido ao tentar definir um valor para a cadeia.
O que é a melhor maneira para inicializar essa estrutura (e tudo isso de cordas internas?
Solução
Você deve usar new
vez de malloc
, para assegurar o construtor é chamado para o DeviceInfo
e seus wstring
s contidos.
DeviceInfo *info = new DeviceInfo;
Em geral, é melhor evitar o uso malloc
em C ++.
Além disso, certifique-se de delete
o ponteiro quando terminar de usá-lo.
Edit: Claro, se você só precisa info
no âmbito local, você não deve alocá-lo na pilha. Basta fazer isso em vez disso:
DeviceInfo info; // constructed on the stack
GetDeviceInfo( &info ); // pass the address of the info
Outras dicas
std :: wstring cria um objeto, e objetos precisam ser construídos. Usando malloc, você contornado o construtor para a sua estrutura, o que inclui construtores para todos os membros.
O erro que você está recebendo é de std :: wstring tentando usar um de seus próprios membros que ainda não foi inicializado.
Você pode usar o novo em vez de malloc, mas, provavelmente, a melhor solução é usar uma variável temporária local e passar o endereço para a função.
DeviceInfo info;
GetDeviceInfo(&info);
Adicionar a função para a estrutura:
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();
Observe o typedef struct {...} nome; padrão não é necessária em C ++. Se você por algum motivo tem que usar uma função livre para isso, referência utilização:
WhatEverReturnType GetDeviceInfo(DeviceInfo &info) {
// do your calculation. info.DevAgentVersion and info.SerialNumber are visible.
}
DeviceInfo d; WhatEverReturnType e = GetDeviceInfo(d);