正确使用vector指针:程序崩溃问题排查与正确用法
问题原因与解决方法
你的程序崩溃的核心原因是:指针a1没有被初始化,属于野指针。
你只定义了std::vector<std::vector<int>> *a1;,但没有让这个指针指向一个实际存在的vector对象。此时a1指向的是内存中随机的非法地址,直接调用a1->push_back(a)相当于往不属于你的内存区域写数据,必然触发崩溃。
两种修复方案
方案1:给指针分配堆内存(手动管理生命周期)
用new创建一个vector对象,让指针指向它:
std::vector<int> a; // 初始化指针,指向堆上的vector实例 std::vector<std::vector<int>> *a1 = new std::vector<std::vector<int>>(); a.push_back(3); a1->push_back(a); cout<<" value is: "<<(*a1)[0][0] + 4 <<endl; // 用完后必须释放内存,避免泄漏 delete a1;
方案2:直接使用栈上的vector对象(推荐,无需手动管理内存)
如果没有必须用指针的场景,直接定义vector对象更安全:
std::vector<int> a; std::vector<std::vector<int>> a1; // 直接创建栈上对象,不用指针 a.push_back(3); a1.push_back(a); cout<<" value is: "<<a1[0][0] + 4 <<endl;
补充说明
你看到其他用户用vector指针但没写数据的情况,大概率是他们的指针已经指向了一个已存在的vector对象(比如指向栈上的对象、函数参数传入的对象,或者已经用new分配好的堆对象),而不是像你这样使用未初始化的野指针。
内容的提问来源于stack exchange,提问作者Gore District
相关产品推荐
相关产品推荐

