我有两个成员的联合。
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
未启动作为字符串的生存期,因此将崩溃。您将必须使用类似的方法,std::string
使用该地址的new位置致电ctor。以后,如果更改数据类型,则必须确保this->mem1
在开始写入并集的其他字段之前记得也调用dtor ,否则将导致内存泄漏或损坏。
到目前为止,使用C ++进行操作的最简单方法是使用类似变量的类型,例如boost::variant
,它将为您处理所有样板和所有细节。(如果只使用没有ctor或dtor的琐碎类型,则联盟可以。)
typedef boost::variant<std::wstring, int> MyUnion;
std::vector<MyUnion> unions;
unions.push_back(L"A");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句