C++模拟Java ArrayList时指针数组无输出问题排查
指针数组测试代码无输出问题排查
问题描述
在模拟Java ArrayList实现的调试过程中,编写的指针数组测试代码编译无报错,但运行后终端无任何输出。代码如下:
int main() { int** a = new int* [4]; for (int i = 0; i < 4; i++) { int b = 0; int* c = new int; *c = b; *(a + 1) = c; } for (int i = 0; i < 4; i++) { cout << **a << endl; } delete[] a; a = nullptr; return 0; }
错误原因分析
指针数组赋值索引错误
第一个循环中,*(a + 1) = c;始终将新分配的指针赋值给数组的第2个元素(索引为1),而数组的首元素a[0]从未被初始化,属于野指针。后续输出时反复解引用这个野指针,触发未定义行为,可能导致程序静默终止或无输出。正确写法应为*(a + i) = c;或更直观的a[i] = c;。输出逻辑错误
第二个循环中,每次都输出**a(即a[0]指向的值),即便前面的赋值逻辑正确,也只会重复输出同一个值。需要改为输出对应索引的元素值,即*a[i]或**(a + i)。内存泄漏问题
代码中仅释放了指针数组a的内存,但每个new int分配的单个int对象未被释放,会造成内存泄漏。需在释放数组前,循环delete每个元素指向的内存。
修正后的代码示例
#include <iostream> using namespace std; int main() { int** a = new int* [4]; for (int i = 0; i < 4; i++) { int b = i; // 修改为i便于区分输出结果 int* c = new int; *c = b; a[i] = c; // 按索引赋值到对应数组位置 } for (int i = 0; i < 4; i++) { cout << *a[i] << endl; // 输出对应索引的元素值 } // 先释放每个int对象的内存 for (int i = 0; i < 4; i++) { delete a[i]; a[i] = nullptr; } // 再释放指针数组本身 delete[] a; a = nullptr; return 0; }
内容的提问来源于stack exchange,提问作者Burak Oruk
相关产品推荐
相关产品推荐

