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?

Foi útil?

Solução

Você deve usar new vez de malloc, para assegurar o construtor é chamado para o DeviceInfo e seus wstrings 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top