0

我正在尝试扩展一个新对象并将其添加到函数内部的数组中,并使该数组在函数外部也受到影响(数组指针作为参数发送)。

void addMedia(Media* medias[], int &nrOfMedias, string title, int publYear, string author, int nrOfPages)
{
    Media** tempArray = new Media*[nrOfMedias +1];
    for(int i = 0; i < nrOfMedias; i++)
    {
        tempArray[i] = medias[i];
    }
    delete [] medias;
    medias = tempArray;
    delete [] tempArray;
    medias[nrOfMedias] = new Book(title, publYear, author, nrOfPages);
    nrOfMedias++;
}

这段代码在函数内部工作得很好,但是当我离开它时,数组仍然是空的。据我了解,这是因为指针在函数内部发生了更改,但是如何在不更改指针的情况下扩展数组?

(我无法更改返回数据类型或参数、赋值要求。)

4

3 回答 3

2

更改medias = tempArray;*medias = tempArray;,使其编译,完善您的内存管理(考虑,真正应该释放什么,不应该释放什么)。

于 2012-05-14T18:00:50.537 回答
2

不要将媒体视为指针数组,将其视为指向数组的指针。工作示例(略微简化):

class Media
{   
public:
    Media () { m_strTitle = "unknown";}
    string m_strTitle;
};

class Book : public Media
{
public:
    Book(string strTitle) { m_strTitle = strTitle; }
};

void addMedia(Media* medias[], int &nrOfMedias)
{
    Media * tempArray = new Media[nrOfMedias +1];
    for(int i = 0; i < nrOfMedias; i++)
    {
        tempArray[i] = (*medias)[i];
    }
    delete [] *medias;
    (*medias) = tempArray;

    (*medias)[nrOfMedias] = Book("newTitle");
    nrOfMedias++;
}

int main()
{
    int numMedia = 10;
    Media * myArray = new Media[numMedia];
    addMedia(&myArray, numMedia);
    for (int i = 0; i < numMedia; i++)
    {
        cout << i << ") " << myArray[i].m_strTitle << endl;
    }

    return 0;
}
于 2012-05-14T18:12:05.777 回答
0

您不需要delete [] tempArray; ,因为实际上指向与之后tempArray相同的内存块mediasmedias = tempArray;

您的功能将在没有该行的情况下运行良好,但我假设您知道您通过什么Media* medias[]

于 2012-05-14T18:34:35.093 回答