C++动态数组二次调用modifyArray函数未正确修改问题求助
问题分析与解决方案
核心问题
你的代码出现预期不符的原因有两个:
- 参数传递错误:
modifyArray函数的FarraySize是传值传递,函数内部修改的只是参数的副本,main函数里的arraySize完全没被更新。第二次调用函数时,还是用初始的数组长度4来处理,最后循环输出的也是这个未更新的长度,自然看不到新增的元素。 - 内存泄漏隐患:函数里的临时数组
subPlaylist用完后没有释放,会导致内存泄漏。
修改后的完整代码
#include <iostream> #include <string> #include <algorithm> // std::copy 需要的头文件 using namespace std; void modifyArray(string*&, int&); int main() { int arraySize = 4; string* 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; } delete[] playlist; // 释放主数组内存,避免泄漏 } void modifyArray(string*& Fplaylist, int& FarraySize) { string* subPlaylist = new string[FarraySize]; copy(Fplaylist, Fplaylist + FarraySize, subPlaylist); delete[] Fplaylist; FarraySize += 1; // 直接修改main函数中的arraySize变量 Fplaylist = new string[FarraySize]; copy(subPlaylist, subPlaylist + FarraySize - 1, Fplaylist); Fplaylist[FarraySize - 1] = "eeee"; delete[] subPlaylist; // 释放临时数组内存 }
关键修改说明
- 数组长度参数改为传引用:将
int FarraySize改为int& FarraySize,这样函数内部对长度的修改会直接同步到main函数的arraySize,第二次调用时就能基于更新后的数组长度处理。 - 清理临时内存:添加
delete[] subPlaylist;和delete[] playlist;,避免动态分配的内存泄漏。 - 补充必要头文件:
std::copy算法需要依赖<algorithm>头文件,否则可能编译报错。
运行结果
修改后程序会输出预期内容:
aaaa bbbb cccc dddd eeee eeee
内容的提问来源于stack exchange,提问作者Ahmed Salah
相关产品推荐
相关产品推荐

