2008-11-25 4 views
2

J'ai une structure comme suit:Structure Init avec std :: wstring

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

} DeviceInfo; 

Mais lorsque je tente de l'utiliser je reçois toutes sortes d'erreurs d'allocation de mémoire.

Si je tente de passer dans une fonction comme celle-ci:

GetDeviceInfo(DeviceInfo *info); 

Je vais obtenir une erreur de vérification d'exécution se plaindre que je ne l'initialiser avant de l'utiliser, ce qui me semblait avoir fixé avec:

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

Mais, dans la fonction, lorsque je tente de définir soit des structures piqûres, il se plaint que je suis en train d'accéder à un mauvais pointeur lorsque vous essayez de définir une valeur à la chaîne.

Quelle est la meilleure façon d'initialiser cette structure (et l'ensemble de ses chaînes internes?

Répondre

9

Vous devez utiliser new au lieu de malloc, pour assurer le constructeur est appelé pour la DeviceInfo et ses contenus wstring s.

DeviceInfo *info = new DeviceInfo; 

en général, il est préférable d'éviter d'utiliser malloc en C++.

, assurez-vous également à delete le pointeur lorsque vous avez fini de l'utiliser. Editer: Bien sûr, si vous avez seulement besoin de info dans la portée locale, vous ne devriez pas l'allouer sur le tas. Faites simplement ceci:

DeviceInfo info; // constructed on the stack 
GetDeviceInfo(&info); // pass the address of the info 
1

std :: wstring crée un objet et les objets doivent être construits. En utilisant malloc, vous avez contourné le constructeur pour votre structure, ce qui inclurait des constructeurs pour tous les membres. L'erreur que vous obtenez vient de std :: wstring essayant d'utiliser un de ses propres membres qui n'est pas encore initialisé.

Vous pouvez utiliser new à la place de malloc, mais la meilleure solution consiste probablement à utiliser une variable temporaire locale et à transmettre son adresse à la fonction.

DeviceInfo info; 
GetDeviceInfo(&info); 
1

Ajouter la fonction à la struct:

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(); 

Notez le nom typedef struct {...}; pattern n'est pas nécessaire en C++. Si pour une raison quelconque vous devez utiliser une fonction gratuite pour cela, utilisez la référence:

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

DeviceInfo d; WhatEverReturnType e = GetDeviceInfo(d); 
Questions connexes