C ++联合字段未正确设置

时间:2013-08-15 07:33:33

标签: c++ unions unassigned-variable

我有一个模板化的联合类型NodeType。 问题是,在没有正确设置其变量字段的分配并且随后访问包含垃圾值时。具体来说,_field1和_field2会出现问题 - 请参阅main。

#include <cstdlib>
#include <iostream>

using namespace std;


        template <class T>
        struct structExampleType                
        {
          T _structField;
          typedef structExampleType<T>* pointerStructExample;
        };


         enum TYPE_tag
         {FIELD1_tag, FIELD2_tag} TYPE_tag; 

          template <class T>//, class P>
          union NodeType
          {
           enum TYPE_tag _nodeType_tag;
           char _field1;
           typename structExampleType<T>::pointerStructExample _field2;

           NodeType(){_field2=0;}

           NodeType(enum TYPE_tag nodeType_tag, char _charField)
           {
            _nodeType_tag=nodeType_tag;
            _field1=_charField;
            //_field2=0;
           }  

           NodeType(enum TYPE_tag nodeType_tag, typename structExampleType<T>::pointerStructExample pointer)
           {
            _nodeType_tag=nodeType_tag;
            _field2=pointer;
            //_field1='-';
           }          

          };







int main(int argc, char *argv[])
{
    NodeType<int> node1, node2;
    structExampleType<int>* structExamplePointer;

    structExamplePointer=new structExampleType<int>();

    structExamplePointer->_structField=100;
//    structExamplePointer->_field2=structExamplePointer;

    node1=NodeType<int>(FIELD1_tag,'-');
    node2=NodeType<int>(FIELD2_tag,structExamplePointer);    


    cout<<endl<<"node1: ";    
    if (node1._nodeType_tag==FIELD1_tag)
    {cout<<node1._field1<<endl;}
    else
    {cout<<node1._field2<<endl;}        


    cout<<endl<<"node2: ";
    if (node2._nodeType_tag==FIELD2_tag)
    {cout<<node2._field1<<endl;}
    else
    {
        cout<<node2._field2<<endl;
        cout<<(node2._field2)->_structField<<endl;
    }  



    system("PAUSE");
    return EXIT_SUCCESS;
}

可能是什么问题?提前感谢您的时间。

4 个答案:

答案 0 :(得分:3)

main中你有这两行:

structExampleType<int>* structExamplePointer;

structExamplePointer->_structField=100;

请记住,局部变量没有初始化,除非它们有默认构造函数(指针没有),所以在第二个中你取消引用未初始化的指针structExamplePointer,导致未定义的行为。

当您尝试设置多个字段时,您似乎也误解了union的目的。在union所有字段中共享相同的空格,因此在写入一个成员时,所有成员都会更改。只有最后写入成员才有效。尝试使用其他字段可能会再次导致未定义的行为。


如果您需要“标记”字段其他数据,则应该选择包含标记和联合数据的结构:

struct NodeType
{
    enum TAG_Type
    {
        FIELD1,
        FIELD2
    } type;

    union
    {
        char field1;
        struct some_struct* field2;
    }
};

答案 1 :(得分:2)

使用union成员会尝试占用内存中的相同空间,因此构造函数会通过分配给每个成员并相互覆盖来导致问题。

  

联盟只有拥有其最大数据成员所需的大小。其他数据成员以与该最大成员的一部分相同的字节分配。

答案 2 :(得分:2)

你实际拥有的不是field1和field2的联合,而是{tag,field1,field2}的联合。这就是你看垃圾的原因。 Union仍然是一个单独的内存区域,但是你在构造逻辑中设置了三次。

您可以从更简单的案例开始,阅读一些文档,例如http://msdn.microsoft.com/en-us/library/5dxy4b7b.aspx

为了实现你的目标,你可以做类似的事情(你需要你的标签在工会的外部):

union MyUnionType {    int data_int;    double data_double; }

typedef enum {IntTag,DoubleTag} UnionTypeTag;

类MyVariableClass {    私人的:      MyUnionType m_variableField;      UnionTypeTag m_variableFieldType; }

另一种方法是设计代码,以便在代码路径中的任何位置知道您正在处理的联合类型的“风格”。

我个人的观点是,当K&amp; R想到联合概念时,后者(总是知道什么是你的联合“味道”)。

答案 3 :(得分:0)

请在使用之前初始化指针structExampleType<int>* structExamplePointer

解除引用未初始化的指针是造成问题的原因