C++向list插入SortedArray时出现读取访问违规问题求助
问题分析与解决方案
首先看你代码里的几个关键问题,这些都可能是触发读取访问违规的根源:
1. 指针访问的语法错误
你写了:
cout << endl << sa[0] << endl;
这里sa是SortedArray<T>*类型的指针,sa[0]等价于*(sa + 0),也就是直接解引用指针得到SortedArray<T>对象。但如果你想访问这个对象的operator[](比如获取内部数组的元素),正确的写法应该是:
cout << endl << (*sa)[0] << endl;
原来的写法相当于把指针sa当成了SortedArray<T>类型的数组,直接取第一个元素,这会触发越界访问,已经属于未定义行为,后续操作自然容易出问题。
2. 模板参数不匹配
代码里出现了类型不一致的问题:
SortedArray<DT>* sa = new SortedArray<T>(l);
DT和T是不同的模板类型参数,除非SortedArray<DT>和SortedArray<T>之间有明确的继承关系(你没有提到),否则这种指针类型转换完全非法,会导致内存布局不匹配,后续的拷贝、访问操作都会引发未定义行为。
3. 拷贝构造函数的浅拷贝问题
当你执行aList->push_front(*sa);时,会调用SortedArray<T>的拷贝构造函数,把sa指向的对象拷贝一份存入list。如果你的SortedArray类用的是默认生成的拷贝构造函数(浅拷贝),而类内部持有动态分配的数组,那么原对象和list中的拷贝对象会共享同一块内存:
- 如果你之后
delete sa;,释放了内部数组的内存,list中的对象再访问这块内存就会触发读取访问违规; - 即使你没delete sa,当list中的对象被销毁时,也会重复释放同一块内存,导致堆损坏。
修复建议
按以下步骤逐一排查修正:
- 修正指针访问语法,把
sa[0]改成(*sa)[0]; - 统一模板参数,将
SortedArray<DT>*改成SortedArray<T>*(或根据实际需求调整,确保类型完全一致); - 为
SortedArray实现正确的深拷贝构造函数和赋值运算符重载,确保每个对象拥有独立的内部动态数组:
template <typename T> class SortedArray { private: T* arr; size_t size; public: // 拷贝构造函数 SortedArray(const SortedArray& other) { size = other.size; arr = new T[size]; // 逐元素拷贝 for (size_t i = 0; i < size; ++i) { arr[i] = other.arr[i]; } } // 赋值运算符重载(遵循RAII原则) SortedArray& operator=(SortedArray other) { std::swap(arr, other.arr); std::swap(size, other.size); return *this; } // 析构函数 ~SortedArray() { delete[] arr; } // 其他成员函数... };
另外,建议尽量避免使用原始指针,改用std::unique_ptr或std::shared_ptr这类智能指针管理内存,减少手动内存管理带来的错误。
内容的提问来源于stack exchange,提问作者Reece Deyoung
相关产品推荐
相关产品推荐

