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?
}
};