类的动态分配数组

Dynamically Allocated Array of a Class

本文关键字:数组 动态分配      更新时间:2023-10-16

我已经声明

private:
    Comment *commentArray;
    int arrSize;

在使用它的类的头中,称为CommentManager。这些在构造器中初始化,如下所示:

arrSize = 1;
commentArray = new Comment[arrSize];

如果我正确理解这一点,这应该创建一个由一个Comment组成的"数组"。然后我设置了这个类的核心功能:

void CommentManager::addComment(QString commText, int start, int end)
{
    Comment *saveArray;
    saveArray = new Comment[arrSize + 1];
    for (int i = 0; i < arrSize; i++)
        saveArray[i] = commentArray[i];
    delete[] commentArray;
    commentArray = saveArray;
    arrSize += 1;

这应该会将commentArray的大小放大一。然后我想添加注释数据,这是通过comment:中声明的函数完成的

标题:

private:
    QString comment;
    int startPosition;
    int endPosition;

功能:

void Comment::setComment(QString comm,int newStartPos, int newEndPos)
{
    comment = comm;
    startPosition = newStartPos;
    endPosition = newEndPos;
}

我调用这个函数如下:

    commentArray[arrSize].setComment(commText,start,end);

这会导致segfault:根据调试器,"comment"不存在。因此,我试图初始化commentArray中的各个注释,但编译器无法编译。我不确定这里出了什么问题,如果有任何帮助,我们将不胜感激。

 commentArray[arrSize].setComment(commText,start,end);

arrsize太大了一步。

大小为10的数组的索引从0到9,使用10将越界。

commentArray[arrSize].setComment(commText,start,end);

总是引用一个不存在的元素,因为您指向的是超过数组中元素数量的一个。声明应为

commentArray[arrSize-1].setComment(commText,start,end);

此外,您可能应该使用容器类,而不是手动管理对象数组。如果您可以使用boost,请查看boost::ptr_vector。如果没有,请考虑使用以下方法之一:

std::vector<std::unique_ptr<Comment> > commentArray;

std::vector<std::shared_ptr<Comment> > commentArray;