c++ 使用函数修改动态数组将在第二次调用该函数时修改原始数组

vhmi4jdf  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(208)

这是一个更大的程序的示例代码。modifyArray函数将数组大小增加1,然后添加一个新的字符串元素,这里是“eeee”,调用该函数一次工作正常,但当第二次调用它修改原始数组时,我希望它修改第一个modifyArray函数产生的数组。以下是代码

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include <filesystem>
#include <iomanip>
#include <string.h>
#include <sstream>

using namespace std;

void modifyArray(string*&, int);

int main()
{
    int arraySize = 4;
    string* playlist;
    playlist = new string[arraySize];
    playlist[0] = "aaaa";
    playlist[1] = "bbbb";
    playlist[2] = "cccc";
    playlist[3] = "dddd";
    
    modifyArray(playlist, arraySize);
        modifyArray(playlist, arraySize);
    for (int i = 0; i < arraySize; i++)
    {
        cout << playlist[i] << endl;
    }
}

void modifyArray(string*& Fplaylist, int FarraySize)
{
    string* subPlaylist;
    subPlaylist = new string[FarraySize];
    copy(Fplaylist, Fplaylist + FarraySize, subPlaylist);

    delete[]Fplaylist;
    FarraySize = FarraySize + 1;
    Fplaylist = new string[FarraySize];
    copy(subPlaylist, subPlaylist + FarraySize - 1, Fplaylist);
    Fplaylist[FarraySize - 1] = "eeee";
    

}

预期产出:

aaaa
bbbb
cccc
dddd
eeee
eeee

真实的输出:

aaaa
bbbb
cccc
dddd

附言:我不能用向量
我尝试过其他方法,比如将数组存储在外部文本文件中,但我得到了同样的结果。我是C++的初学者,所以我真的不太理解指针。

ftf50wuq

ftf50wuq1#

modifyArray函数有两个问题。
第一个问题是FarraySize应该是一个引用,这样对它的更改会影响用于调用函数的变量(与Fplaylist完全一样)。
第二个问题是函数进行了两次分配和两次拷贝,而实际上应该是每种分配和拷贝各一次。进行两次分配会泄漏内存,而进行两次拷贝则是不必要的低效。
这是一个有效的版本

void modifyArray(string*& Fplaylist, int& FarraySize)
{
    string* newPlaylist = new string[FarraySize + 1];
    copy(Fplaylist, Fplaylist + FarraySize, newPlaylist);
    newPlaylist[FarraySize++] = "eeee";
    delete[] Fplaylist;
    Fplaylist = newPlaylist;
}

相关问题