memset 导致 std::string 分配崩溃

发布于 2024-12-25 06:17:08 字数 877 浏览 1 评论 0原文

我的代码可以在 Windows 上运行,但现在我使用 Xcode 3.2.5 C/C++ 编译器版本 GCC 4.2 移植到 MAC,它崩溃了。

我已将其范围缩小到 memset 调用。如果我注释掉 memset 它会起作用,如果我将它放回代码中则会崩溃。

我的头文件中有一个如下所示的结构:

typedef struct 
{
    int deviceCount;
    struct 
    {
        #define MAX_DEVICE_ID 256
        #define MAX_DEVICE_ENTRIES 10
        std::string deviceId;   // Device name to Open
        TransportType   eTransportType;
    } deviceNodes[MAX_DEVICE_ENTRIES];
} DeviceParams;

然后在 cpp 文件中我有这样的:

DeviceParams Param;
memset(&Param, nil, sizeof(Param));

... 后来我有这样的:

pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset

就像我之前说的,如果我删除 memset 调用,一切都会正常。如果我在调用 memset 之前查看调试器,结构中的字符串为 \0,而在 memset 之后它们为零。

为什么 nil 字符串会在赋值行上崩溃并且仅在 MAC 上崩溃?

谢谢。

I have code that works on Windows, but now that I am porting to a MAC, using Xcode 3.2.5 C/C++ Compiler Version GCC 4.2, it crashes.

I have narrowed it down to a memset call. If I comment out the memset it works, and if I put it back in the code crashes.

I have a structure that looks like this in my header file:

typedef struct 
{
    int deviceCount;
    struct 
    {
        #define MAX_DEVICE_ID 256
        #define MAX_DEVICE_ENTRIES 10
        std::string deviceId;   // Device name to Open
        TransportType   eTransportType;
    } deviceNodes[MAX_DEVICE_ENTRIES];
} DeviceParams;

Then in a cpp file I have this:

DeviceParams Param;
memset(&Param, nil, sizeof(Param));

... later I have this:

pParam->deviceNodes[index].deviceId = "some string"; // <----- Line that crashes with memset

Like I said before if I remove the memset call everything works fine. If I look at the debugger before I call the memset my strings in the structure are \0 and after the memset they are nil.

Why does the nil string crash on a assignment line and only on a MAC?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

柏林苍穹下 2025-01-01 06:17:08

您通过执行 memset 来覆盖 deviceId 的内部数据;除了 POD 数据类型之外,不要对任何内容执行 memset 。这是C++,我们有构造函数。你的代码应该看起来像这样:

struct DeviceParams
{
    int deviceCount;

    struct DeviceNode
    {
        DeviceNode() : eTransportType() { } // initialise eTransportType
                                            // to 0, deviceId initialises itself

        static const int MAX_DEVICE_ID = 256;
        static const int MAX_DEVICE_ENTRIES = 10;

        std::string deviceId; // Device name to Open
        TransportType eTransportType;
    } deviceNodes[DeviceNode::MAX_DEVICE_ENTRIES];
};

然后

DeviceParams Param;

// get a pointer to Param in pParam

pParam->deviceNodes[index].deviceId = "some string";

You're overwriting deviceId's internal data by doing memset all over it; don't ever do memset over anything but a POD data type. This is C++, we have constructors. Your code should look something like this:

struct DeviceParams
{
    int deviceCount;

    struct DeviceNode
    {
        DeviceNode() : eTransportType() { } // initialise eTransportType
                                            // to 0, deviceId initialises itself

        static const int MAX_DEVICE_ID = 256;
        static const int MAX_DEVICE_ENTRIES = 10;

        std::string deviceId; // Device name to Open
        TransportType eTransportType;
    } deviceNodes[DeviceNode::MAX_DEVICE_ENTRIES];
};

Then

DeviceParams Param;

// get a pointer to Param in pParam

pParam->deviceNodes[index].deviceId = "some string";
尐偏执 2025-01-01 06:17:08

在 C++ 中,在非 PODmemset() 是非法的> 数据类型。包含 std::string 成员的结构不是 POD。

It is illegal in C++ to call memset() on a non-POD data type. Structures containing std::string members are not POD.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文