gpt4 book ai didi

c++ - 程序在已识别 union 的拷贝构造函数内部崩溃

转载 作者:行者123 更新时间:2023-12-02 07:15:02 27 4
gpt4 key购买 nike

因此,我一直在尝试为我的项目创建一个有区别的工会。来自C,我认为这是微不足道的...;)
该结构名为Message。它具有一个MessageType和一个内部并集,内部联合包含MessageGetMessageSet

enum MessageType {
MESSAGE_GET,
MESSAGE_SET
};

struct MessageGet {
std::string store_name;
std::vector<uint8_t> key;
};

struct MessageSet {
std::string store_name;
std::vector<uint8_t> key;
std::vector<uint8_t> value;
};

struct Message {
MessageType type;

uint64_t sender_id;

union U {
U() : get() {}

U(const U& other) {
get = other.get;
set = other.set;
}

~U() {}

U& operator=(const U& other) {
set = other.set;
get = other.get;
return *this;
}

MessageGet get;

MessageSet set;
} as;

Message() {}

~Message() {
switch (type) {
case MESSAGE_GET: {
as.get.~MessageGet();
break;
}
case MESSAGE_SET: {
as.set.~MessageSet();
break;
}
}
}

Message(MessageGet get, uint64_t sender_id) {
type = MESSAGE_GET;
as.get = get;
sender_id = sender_id;
}

Message(MessageSet set, uint64_t sender_id) {
type = MESSAGE_SET;
as.set = set;
sender_id = sender_id;
}

Message(const Message& other) {
type = other.type;
as = other.as;
sender_id = other.sender_id;
}

Message& operator=(const Message& other) {
type = other.type;
as = other.as;
sender_id = other.sender_id;
return *this;
}
};
该程序在代码中我执行以下操作的其他地方崩溃:
Message message(MessageGet {std::move(store_name), std::move(key)}, sender);
messages.push_back(message); // messages is a local std::vector<Message>
它不会因异常而崩溃-只是崩溃。
我设法将其范围缩小到 Message复制构造函数内部。之后,不知道是什么原因造成的。想法将不胜感激。

最佳答案

    U(const U& other) {
get = other.get;
set = other.set;
}
这总是将 set设置为最后,从而使 get的值无效。当您设置一个联盟成员时,它将使所有其他成员无效。这就是使联合与结构不同的原因。
您在哪里:
    as = other.as;
您必须更改它以仅复制有效成员。

关于c++ - 程序在已识别 union 的拷贝构造函数内部崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62542654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com