如何动态创建vector并以指针形式存入指针向量,且避免new与智能指针?
解决方案:不用new和智能指针存储vector指针
要解决局部变量作用域导致的指针悬空问题,同时避开new和智能指针,核心思路是延长被指向对象的生命周期,以下是几种可行方案:
方案1:利用静态局部变量
静态局部变量的生命周期从第一次初始化持续到程序结束,不会随函数退出而销毁,因此指针不会悬空:
std::vector<std::vector<int>*> vecofvec; void add_vec() { static std::vector<int> temp; // 静态局部变量,生命周期覆盖整个程序 vecofvec.push_back(&temp); }
注意:静态变量是全局唯一的,多次调用add_vec会复用同一个temp对象,如果你需要多个独立的vector,这个方案不适用。
方案2:用容器管理vector对象的生命周期
创建一个专门存储vector<int>的容器,确保它的生命周期比vecofvec更长,然后将容器内元素的地址存入vecofvec:
// 这个存储容器的生命周期要覆盖vecofvec的使用周期 std::vector<std::vector<int>> vec_storage; std::vector<std::vector<int>*> vecofvec; // 添加新vector并存储其指针 vec_storage.emplace_back(); // 在vec_storage中创建新的vector<int> vecofvec.push_back(&vec_storage.back()); // 取新元素的地址存入vecofvec
关键注意事项:如果vec_storage发生扩容(比如push_back时空间不足),内部元素的内存地址会改变,导致vecofvec里的指针失效。可以提前用reserve预留足够空间避免扩容:
vec_storage.reserve(20); // 提前预留20个元素的空间,后续添加不会触发扩容
这个方案能创建多个独立的vector,且不需要手动管理内存,是比较推荐的方式。
方案3:使用全局变量
将vector<int>定义为全局变量,其生命周期从程序启动到结束,指针始终有效:
std::vector<int> global_vec; // 全局变量 std::vector<std::vector<int>*> vecofvec; // 存入指针 vecofvec.push_back(&global_vec);
缺点:全局变量会增加代码耦合度,不利于维护,除非必要不建议使用。
内容的提问来源于stack exchange,提问作者sarabjot singh
相关产品推荐
相关产品推荐

