这是一个更大的程序的示例代码。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++的初学者,所以我真的不太理解指针。
1条答案
按热度按时间ftf50wuq1#
modifyArray
函数有两个问题。第一个问题是
FarraySize
应该是一个引用,这样对它的更改会影响用于调用函数的变量(与Fplaylist
完全一样)。第二个问题是函数进行了两次分配和两次拷贝,而实际上应该是每种分配和拷贝各一次。进行两次分配会泄漏内存,而进行两次拷贝则是不必要的低效。
这是一个有效的版本