将向量初始化添加到结构构造函数

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 一样默认构造,它会用空值填充数组

以上是关于将向量初始化添加到结构构造函数的主要内容,如果未能解决你的问题,请参考以下文章

将构造函数传递给函数

如何将多个构造函数添加到结构?

在类构造函数上初始化向量

运行时在构造函数中初始化向量类成员——C++

在构造函数中初始化成员变量二维向量

构造函数中的引用向量:未初始化的引用