我有两个成员的联合。

union myUnion {
    std::wstring mem1;
    int mem2;
    myUnion(std::wstring in){
        this->mem1 = in;
    }
    myUnion(int in){
        this->mem2 = in;
    }
    myUnion(const myUnion& in){
        if(this->mem2){
            this->mem2 = in.mem2;
        }else{
            this->mem1 = in.mem1;
        }
    }
};
//and then I make a vector out of the union:
std::vector<myUnion> unions;
//but when I try to push_back:
unions.push_back(L"A");

很快就会出现运行时错误:
0xC0000005:访问冲突写入位置0xCCCCCCCC。
当我尝试调试该程序时,我意识到mem1尚未分配内存。我真的不知道为什么会这样,我想知道我该如何解决。

最佳答案

在C++中,union并不是很自然的数据类型,因为它实际上并不完全符合整个C++构造函数和析构函数的思想。在C++中创建联合时,它不会为其任何可能的类型调用构造函数,因为它们都将在彼此的基础上进行编写。

所以这个构造函数

myUnion(std::wstring in){
    this->mem1 = in;
}

将崩溃,因为this->mem1的生存期(作为字符串)尚未启动。您将必须使用类似的方法,使用该地址的new位置调用std::string ctor。以后,如果您更改数据类型,则必须确保在开始写入并集的其他字段之前,也记得记得调用dtor来生成this->mem1,否则会导致内存泄漏或损坏。

到目前为止,在C++中执行操作的最简单方法是使用boost::variant这样的变体类型,它将为您处理所有样板和所有细节。 (如果只使用没有ctor或dtor的琐碎类型,则联盟可以。)
typedef boost::variant<std::wstring, int> MyUnion;

std::vector<MyUnion> unions;

unions.push_back(L"A");

关于c++ - 我如何为尚未初始化的 union 成员分配内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32303645/

10-09 19:55