c++动态申请内存,仍然显示缓冲区溢出

问题遇到的现象和发生背景

定义了一个类goods的二级指针,并且new了内存空间newsize
newsize=good_num+addnum;
在for循环里对二级指针赋值,提示写入newspace时缓冲区溢出

问题相关代码,请勿粘贴截图

以为下部分代码

        Goods* m = NULL;  //定义一级指针
        int newsize = goods_num + addnum;
        Goods** newspace = new Goods * [newsize];    //定义二级指针并开辟新空间;
        if (p_goods != NULL)
        {
            for (int i = 0; i < goods_num; i++)
                newspace[i] = this->p_goods[i];
        }       //加入原有的数据
        for (int i = 0; i < addnum; i++)
        {
            char name[10];
            int price;
            int cost;
            cout << "输入添加商品名称:";
            cin >> name;
            cout << "设置价格:";
            cin >> price;
            cout << "输入成本:";
            cin >> cost;
            cout << "添加成功!" << endl;
            m = new Goods(name,price,cost);//一级指针指向new的对象
            newspace[goods_num + i] = m;//一级指针存入二级指针
        }

运行结果及报错内容

警告:写入newspace时缓冲区溢出

请问如何解决

一级指针也需要开辟空间

    Goods** newspace = new Goods * [newsize];

    for(int i=0;i<goods_num;i++){
        newspace[i]= new Goods[newsize];
        newspace[i] = this->p_goods[i];
    }

New 和delete要成对使用,你循环每次new,没有delete,可以在每一次循环结束前delete m,看看能不能解决你的问题

二级指针,可以这样理解,一级存元素,二级存一级的地址,都是数组,所以一级二级都需要单独分配内存,释放时先一级后二级

以下代码在vs2019 控制台程序验证过,可行!

int main()
{
    int goods_num = 0;
    int addnum = 2;


    int newsize = goods_num + addnum;
    Goods** newspace = (Goods**)malloc(sizeof(Goods*) * newsize);
    memset(newspace, 0, sizeof(Goods*) * newsize);
    for (int i = 0; i < addnum; i++)
    {
        char name[10];
        int price;
        int cost;
        cout << "输入添加商品名称:";

        cin >> name;
        cout << "设置价格:";

        cin >> price;
        cout << "输入成本:";
        cin >> cost;

        cout << "添加成功!" << endl;
        Goods* m = new Goods(name, price, cost);
        newspace[goods_num + i] = m;
    }
}

顺便说一句,new Goods * [newsize]; 我没有见过这样用的,如果不是C++新语法的话,我只能认为,你开辟了一个对象,然后把对象指针偏移了newsize 个单位,每个单位是Goods。
望楼主采纳!
如果看不太懂,我可以稍微讲讲