将向量初始化添加到结构构造函数
Posted
技术标签:
【中文标题】将向量初始化添加到结构构造函数【英文标题】:Adding vector initialization to struct constructor 【发布时间】:2013-01-24 15:49:07 【问题描述】:我有一个结构如下:
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));
;
但这会引发运行时错误:0xC0000005:访问冲突写入位置 0xcdcdcdcd。 Octree_octnode_0113.exe 中 0x771115de 处未处理的异常:0xC0000005:访问冲突写入位置 0xcdcdcdcd。
在创建空向量时发生访问冲突。有没有办法在构造函数中初始化向量,这样就不会出现错误?
【问题讨论】:
parent
没有指向任何地方,也没有初始化。您如何认为这是有意义的?
【参考方案1】:
在下面
memset(parent,0,sizeof(parent));
您将一个未初始化的指针传递给memset()
。你的意思是说:
memset(&parent, 0, sizeof(parent));
或者,很简单
parent = NULL; // or nullptr
?
【讨论】:
child
的行在 OP 的代码中是正确的,因为这是一个指针数组。最有可能的是,parent
的初始化应该只是将其设置为NULL
(可以在初始化列表中完成)。【参考方案2】:
此行导致使用未初始化的指针:
memset(parent,0,sizeof(parent));
您应该将其设置为 NULL
:
parent = NULL;
(或者更好的是,在初始化列表中这样做:)
octNode() : parent(NULL)
memset(child,0,sizeof(child));
【讨论】:
为什么没有孩子的初始化列表? @MooingDuck 据我所知,在 C++11 之前,数组不能在初始化列表中初始化其元素。另外,那将是childNULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
,它既冗长又脆弱(更改child
数组的长度会导致初始化不完整)。当然,std::vector
会比数组更好。
:child()
适用于 C++03 和 C++11。与new T[2]
完全一样是默认初始化的,但new T[2]()
是值初始化的:ideone.com/3Paskj
@MooingDuck 那也行,是的。 (但是,问题的答案是“您正在初始化 parent
错误”,因此在这方面 child
的初始化风格值得注意,但没有直接关系。)
是的,这与问题没有直接关系,但我认为它也值得注意。【参考方案3】:
代码应该说:
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?
;
【讨论】:
child 也可以像 pointindex 一样默认构造,它会用空值填充数组以上是关于将向量初始化添加到结构构造函数的主要内容,如果未能解决你的问题,请参考以下文章