我有两个成员的联合。
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/