C++ 向结构构造函数添加向量初始化

C++ 向结构构造函数添加向量初始化,c++,struct,C++,Struct,我有一个结构,如下所示: struct octNode{ octNode* parent; octNode* child[8]; std::vector<int> pointIndex; //constructor of the struct octNode() { memset(parent,0,sizeof(parent)); memset(child,0,sizeof(child)); } }; struct-octNode{ 八节点*父节点; 八节

我有一个结构,如下所示:

struct octNode{
octNode* parent;
octNode* child[8];
std::vector<int> pointIndex;
//constructor of the struct
octNode()
{ 
      memset(parent,0,sizeof(parent));
      memset(child,0,sizeof(child));
}
};
struct-octNode{
八节点*父节点;
八节点*子节点[8];
向量点索引;
//结构的构造函数
八节点()
{ 
memset(父级,0,sizeof(父级));
memset(child,0,sizeof(child));
}
};
但这会引发一个运行时错误:0xC0000005:访问冲突写入位置0xCDCDCD。 八叉树_octnode_0113.exe中0x771115de处未处理的异常:0xC0000005:访问冲突写入位置0xCDCDCD

在创建空向量时发生访问冲突。有没有一种方法可以初始化构造函数中的向量,这样就不会发生错误?

在下面的

  memset(parent,0,sizeof(parent));
您正在将未初始化的指针传递给
memset()
。你的意思是说:

  memset(&parent, 0, sizeof(parent));
或者,非常简单

  parent = NULL; // or nullptr

此行导致使用未初始化的指针:

memset(parent,0,sizeof(parent));
您只需将其设置为
NULL

parent = NULL;
(最好在初始化列表中执行此操作:)

代码应该是:

struct octNode{
    octNode* parent;
    octNode* child[8];
    std::vector<int> pointIndex;
    //constructor of the struct
    octNode()
    : parent(NULL) // maybe nullptr ?
    , pointIndex()
    { 
        std::fill_n(child, 8, NULL); // nullptr?
    }
};
struct-octNode{
八节点*父节点;
八节点*子节点[8];
向量点索引;
//结构的构造函数
八节点()
:parent(NULL)//可能是NULL ptr?
,pointIndex()
{ 
std::fill_n(child,8,NULL);//nullptr?
}
};

父级
未指向任何位置,也未初始化。您认为这有什么意义?OP代码中的
行是正确的,因为这是一个指针数组。最有可能的是,父项的初始化应该只是将其设置为空值(可以在初始化列表中完成)。子项也可以像pointindex一样默认构造,它将用空值填充数组,而没有子项的初始化列表?@MooingDuck据我所知,数组不能在C++11之前的初始值设定项列表中初始化其元素。另外,这将是
child{NULL,NULL,NULL,NULL,NULL,NULL,NULL}
这是冗长而脆弱的(更改
child
数组的长度将导致初始化不完整)。当然,
std::vector
比数组更好。
:child()
在C++03和C++11中都能工作。与
new T[2]
完全相同的是默认初始化,但是
new T[2]()
是值初始化:@MooingDuck那么也可以,是的。(然而,问题的答案是“您正在初始化
父项
错误”,因此在这方面,
子项
的初始化风格值得注意,但没有直接关系。)是的,它与问题没有直接关系,但我认为它也值得注意。
struct octNode{
    octNode* parent;
    octNode* child[8];
    std::vector<int> pointIndex;
    //constructor of the struct
    octNode()
    : parent(NULL) // maybe nullptr ?
    , pointIndex()
    { 
        std::fill_n(child, 8, NULL); // nullptr?
    }
};