You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改带下标运算符的指针Matrix类以正确存储cchar_t类型指针

问题原因

你的代码触发错误主要有三个核心问题:

  1. 野指针操作:main函数中定义的cchar_t *w没有分配内存就直接传入setcchar,属于未定义行为,会直接触发段错误。
  2. 空指针解引用:Matrix内部存储的是cchar_t*类型,resize操作只会将指针初始化为空值,Proxy的operator[]直接对空指针解引用,必然报错。
  3. 数组越界访问:你初始化的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 13:36:00