Qwen3.5生成的简化版vector存在野指针bug
今天用Qwen3.5生成了一份简化版vector代码#ifndef MY_VECTOR_H #define MY_VECTOR_H #include iostream #include algorithm // 用于 std::swap #include stdexcept // 用于 std::out_of_range template class T class My_vector { private: T* _start; // 指向数组的起始位置 T* _finish; // 指向最后一个有效元素的下一个位置 T* _end_of_storage; // 指向当前分配内存的末尾位置 public: // 迭代器vector的迭代器本质上就是原生指针 typedef T* iterator; typedef const T* const_iterator; // 默认构造 My_vector() : _start(nullptr), _finish(nullptr), _end_of_storage(nullptr) {} // 析构函数 ~My_vector() { delete[] _start; } // 获取元素个数 size_t size() const { return _finish - _start; } // 获取容量 size_t capacity() const { auto rtn _end_of_storage - _start; return rtn; } // 判空 bool empty() const { return _start _finish; } // 迭代器接口 iterator begin() { return _start; } iterator end() { return _finish; } // 下标访问 (带越界检查) T operator[](size_t pos) { if (pos size()) throw std::out_of_range(Index out of range); return _start[pos]; } const T operator[](size_t pos) const { if (pos size()) throw std::out_of_range(Index out of range); return _start[pos]; } // 扩容函数预留空间 void reserve(size_t n) { if (n capacity()) { size_t old_size size(); T* new_data new T[n]; // 1. 开辟新空间 // 2. 迁移旧数据如果有 if (_start) { for (size_t i 0; i old_size; i) { new_data[i] std::move(_start[i]); // 使用移动语义提升效率 } delete[] _start; // 3. 释放旧空间 } // 4. 更新指针 _start new_data; _finish _start old_size; _end_of_storage _start n; } } // 尾插元素 void push_back(const T val) { if (_finish _end_of_storage) { // 如果容量为0先给4个空间否则扩容为原来的2倍 auto rsv capacity() 0 ? 4 : capacity() * 2; reserve(rsv); } *_finish val; _finish; } // 尾删元素 void pop_back() { if (!empty()) { --_finish; } } // 拷贝构造深拷贝 My_vector(const My_vectorT v) { reserve(v.capacity()); for (size_t i 0; i v.size(); i) { _start[i] v._start[i]; } _finish _start v.size(); } // 赋值运算符重载现代写法利用拷贝构造和swap My_vectorT operator(My_vectorT v) { std::swap(_start, v._start); std::swap(_finish, v._finish); std::swap(_end_of_storage, v._end_of_storage); return *this; } }; #endif // MY_VECTOR_Hreserve()方法中若发生了内存重新分配则会释放_start指向的内存若_start非空。拷贝构造函数中没有为_start提供默认值nullptr这导致执行其中的reserve()时_start为野指针但试图释放该块内存导致崩溃。正确做法是为拷贝构造函数提供与默认构造函数相同的初始化列表。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2570112.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!