将Last元素设置为NULL

时间:2018-12-14 18:43:33

标签: c++ oop dynamic-memory-allocation

我有一个对象类数组,我想将最后一个indexi分配为NULL 我有以下代码,但它给出了错误

DNA是一类

allRightSequences是向量

DNA* newDNA = new DNA[allRightSequences.size()];

newDNA [allRightSequences.size()] = NULL; << this line gives an error

4 个答案:

答案 0 :(得分:5)

NULL是一个宏,在适当的情况下,它将扩展为可以视为空指针常量的内容。因此,您可以使用它来设置指针值:

int *ip = NULL; // okay

但是,newDNA不包含指针;它包含类型DNA的对象。暂时忘记阵列。问题是这样的:

DNA dna = NULL;

除非DNA有一个可以用NULL扩展的构造函数调用的构造函数,否则它将无法工作。

如果确实需要在数组末尾添加标记,则需要创建一个指针数组。但是您确实不需要。使用std::vector<DNA>,它会为您跟踪尺寸。

答案 1 :(得分:1)

allRightSequences.size()不是具有allRightSequences.size()元素的数组的最后一个索引。最后一个索引是allRightSequences.size() - 1。未定义访问数组的行为。

另一个潜在的问题:必须存在适当的赋值运算符,才能为DNA对象分配指针。除非您定义了此类运算符,否则赋值格式不正确。

答案 2 :(得分:1)

您可能想要的(尽管尚不能确定问题)是指向DNA对象的指针数组。 您声明的是“只是”一系列DNA对象;并且您不能将对象设置为null,因为Pete Becker's answer解释得很好。

以下代码将起作用:

// notice how we use +1 here to have place for the NULL element at the end
DNA* newDNA[] = new DNA*[allRightSequences.size()+1];  
newDNA [allRightSequences.size()] = NULL;

但是,对于数组的每个元素,还必须通过new DNA...创建一个DNA对象,然后...

请注意,如果使用支持C ++ 11的编译器,请使用nullptr而不是NULL。 而且,如果您想完全避免使用指针的麻烦,可以使用std::optional之类的结构,以防在早期版本中使用C ++ 17或boost::optional,如this answer to another question中所述,如上文Baum mit Augen所述。

另外,好的问题是,您到底需要什么零指针-如果仅是要在遍历数组时确定最后一个元素,那么最好使用std::vector<DNS>或类似的方法集合类型...

答案 3 :(得分:-1)

使用以下代码:

apply

因为C ++中的数组索引从newDNA [allRightSequences.size()-1] = NULL; 0,其中n-1返回allRightSequences.size(),其中n是数组。