2

我的结构如下:

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

} DeviceInfo;

但是当我尝试使用它时,我会遇到各种内存分配错误。

如果我尝试将它传递给这样的函数:

GetDeviceInfo(DeviceInfo *info);

我会得到一个运行时检查错误,抱怨我在使用它之前没有初始化它,我似乎已经修复了:

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

但是,在函数中,当我尝试设置任何一个结构时,它会抱怨我在尝试为字符串设置值时尝试访问错误的指针。

初始化这个结构的最好方法是什么(以及它所有的内部字符串?

4

3 回答 3

10

您应该使用new而不是malloc, 以确保为 theDeviceInfo及其包含wstring的 s 调用构造函数。

DeviceInfo *info = new DeviceInfo;

一般来说,最好避免malloc在 C++ 中使用。

另外,请确保在delete使用完指针后指向指针。

编辑:当然,如果你只需要info在本地范围内,你不应该在堆上分配它。只需这样做:

DeviceInfo info; // constructed on the stack
GetDeviceInfo( &info ); // pass the address of the info
于 2008-11-25T19:09:04.257 回答
1

std::wstring 创建一个对象,需要构造对象。通过使用 malloc,您绕过了结构的构造函数,其中包括所有成员的构造函数。

您得到的错误来自 std::wstring 试图使用它自己的仍然未初始化的成员之一。

您可以使用 new 而不是 malloc,但最好的解决方案可能是使用局部临时变量并将其地址传递给函数。

DeviceInfo info;
GetDeviceInfo(&info);
于 2008-11-25T19:14:41.347 回答
1

将函数添加到结构中:

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);
于 2008-11-25T19:18:38.780 回答