如何修改带下标运算符的指针Matrix类以正确存储cchar_t类型指针
问题原因
你的代码触发错误主要有三个核心问题:
- 野指针操作:
main函数中定义的cchar_t *w没有分配内存就直接传入setcchar,属于未定义行为,会直接触发段错误。 - 空指针解引用:Matrix内部存储的是
cchar_t*类型,resize操作只会将指针初始化为空值,Proxy的operator[]直接对空指针解引用,必然报错。 - 数组越界访问:你初始化的Matrix是1行1列,合法下标仅为
[0][0],代码中调用m[1][1]属于越界访问,同样会触发段错误。
修改后可运行代码
#include <iostream> #include <vector> #include <string> #include <typeinfo> #include <ncursesw/ncurses.h> #include <ncursesw/panel.h> class Matrix { std::vector<std::vector<cchar_t*>> m; public: Matrix(int x = 0, int y = 0) { m.resize(x); for (int i = 0; i < x; ++i) { m[i].resize(y); // 给每个cchar_t指针分配实际内存,避免空指针 for (int j = 0; j < y; ++j) { m[i][j] = new cchar_t{}; } } } // 析构函数释放内存,避免泄漏 ~Matrix() { for (auto &row : m) { for (auto ptr : row) { delete ptr; } } } class Proxy { std::vector<cchar_t*> &mm; public: Proxy(std::vector<cchar_t*> &c) : mm(c) {} cchar_t& operator[](int index) { // 可自行添加下标越界判断提升安全性 return *mm[index]; } // 如果需要直接操作指针,可使用这个接口 cchar_t*& get_ptr(int index) { return mm[index]; } }; Proxy operator[](int index) { // 可自行添加下标越界判断提升安全性 return Proxy(m[index]); } }; int main() { wchar_t wR = u'W'; // 给w分配内存 cchar_t *w = new cchar_t{}; setcchar(w, &wR, 0, COLOR_PAIR(0), NULL); Matrix m(2, 2); m[0][0] = *w; std::cout << typeid(m[0][0]).name() << std::endl; // 释放w的内存 delete w; return 0; }
适配存储指针的调整方案
如果你需要直接存储外部cchar_t对象的指针,不需要内部提前分配内存,可以把Proxy的接口调整为直接返回指针引用,赋值时直接传入有效指针即可:
// Proxy类新增或者替换原有operator[] cchar_t*& operator[](int index) { return mm[index]; } // 赋值时直接写 m[0][0] = w; 即可,不需要解引用
内容的提问来源于stack exchange,提问作者Jim Somers
相关产品推荐
相关产品推荐

