SLCoCo 发表于 2022-6-9 13:11

各位大佬能帮忙看看如何解决缓冲区溢出吗

刚开始学C++,跟着B站的视频学发现这里
newSpace = worker;
会出现缓冲区溢出,这是为什么?该如何解决?谢谢
if (addNum > 0)
        {
                //计算新空间人数
                int newSize = this->m_EmpNum + addNum;

                //开辟新空间
                Worker** newSpace = new Worker * ;

                //将原来的空间下的数据拷贝到新空间下
                if (this->m_EmpArray != NULL)
                {
                        for (int i = 0; i < this->m_EmpNum; i++)
                        {
                                newSpace = this->m_EmpArray;
                        }
                }

                //添加新数据
                for (int i = 0; i < addNum; i++)
                {
                        int id;
                        string name;//姓名
                        int dSelect;//部门

                        cout << "请输入第" << i + 1 << "个新职工编号" << endl;
                        cin >> id;

                        cout << "请输入第" << i + 1 << "个新职工姓名" << endl;
                        cin >> name;

                        cout << "请选择第" << i + 1 << "个新职工部门" << endl;
                        cout << "1、普通职工" << endl;
                        cout << "2、经理" << endl;
                        cout << "3、老板" << endl;
                        cin >> dSelect;

                        Worker* worker = NULL;
                        switch (dSelect)
                        {
                        case 1:
                                worker = new Employee(id, name, 1);
                                break;
                        case 2:
                                worker = new Manager(id, name, 2);
                                break;
                        case 3:
                                worker = new Boss(id, name, 3);
                                break;
                        default:
                                break;
                        }

                        //将创建的职工指针保存到数组
                        newSpace = worker;

                }

FlyingFire 发表于 2022-6-9 13:44

单从你贴出的这段代码没看出什么问题。把完整代码发出来看看?

ryosga 发表于 2022-6-9 15:21


      //开辟新空间
      Worker** newSpace = new Worker * ;

改成

      //开辟新空间
      Worker** newSpace = new Worker;

SLCoCo 发表于 2022-6-9 17:03

ryosga 发表于 2022-6-9 15:21
//开辟新空间
      Worker** newSpace = new Worker * ;


这样不行,直接报错了
严重性      代码      说明      项目      文件      行      禁止显示状态
错误(活动)      E0144      "Worker *" 类型的值不能用于初始化 "Worker **" 类型的实体
错误(活动)      E0604      不允许使用抽象类 "Worker" 数组

SLCoCo 发表于 2022-6-9 17:12

FlyingFire 发表于 2022-6-9 13:44
单从你贴出的这段代码没看出什么问题。把完整代码发出来看看?

整个放不上来超出文件大小了,跟他有关联的是这两个头文件
#pragma once
#include <iostream>
using namespace std;
#include <string>

//职工抽象类
class Worker
{
public:

        //显示个人信息
        virtual void showInfo() = 0;
        //获取岗位名称
        virtual string getDeptName() = 0;
        //职工编号
        int m_Id;
        //职工姓名
        string m_name;
        //部门编号
        int m_DeptId;
};
#pragma once
#include <iostream>
#include"worker.h"
#include"employee.h"
#include"boss.h"
#include"manager.h"
using namespace std;

class WorkerManger
{
public:

        WorkerManger();

        //展示菜单
        void show_Menu();

        //退出系统
        void ExitSystem();

        //记录职工人数
        int m_EmpNum;

        //职工数组指针
        Worker** m_EmpArray;

        //添加职工
        void Add_Emp();

        ~WorkerManger();
};

SLCoCo 发表于 2022-6-9 19:25

看到一个解决方法但是不知道为什么

//开辟新空间
Worker** newSpace = new Worker * ;
改成
Worker** newSpace = new Worker * ;

福仔 发表于 2022-6-9 21:37

this->m_EmpNum 有没有可能这个成员没有初始化随机值是负数, 然后你直接使用?
或者参数有没有可能是负数? newSize 的结果有没有可能是负数或者0?
因为看你这里是申请了 newSize 个成员, newSize 是 this->m_EmpNum + addNum 得来的
检查一下 this->m_EmpNum 和 addNum 这两个有没有问题
至少看你贴出来的代码是没有溢出的

而且你确定就是溢出而不是其他问题吗?
运行时IDE有什么提示吗?

SLCoCo 发表于 2022-6-10 11:56

福仔 发表于 2022-6-9 21:37
this->m_EmpNum 有没有可能这个成员没有初始化随机值是负数, 然后你直接使用?
或者参数有没有可能是负数? ...

我用的vs2022,运行是没有问题但是会出现警告溢出
警告        C6386        写入 "newSpace" 时缓冲区溢出。

FlyingFire 发表于 2022-6-10 13:32

SLCoCo 发表于 2022-6-9 17:12
整个放不上来超出文件大小了,跟他有关联的是这两个头文件
#pragma once
#inclu ...

还是得需要看实现才行。你调试的时候看看this->m_EmpNum、addNum的值。

FlyingFire 发表于 2022-6-10 13:34

SLCoCo 发表于 2022-6-9 19:25
看到一个解决方法但是不知道为什么

//开辟新空间


这个修改可以是因为申请的空间变大了, newSpace是数组,数组里面存放的Worker*即Worker指针。改成这样Worker** newSpace = new Worker * ;后newSpace数组的大小变成了newSize*sizeof(Worker),而之前newSpace数组的大小为newSize。
页: [1] 2
查看完整版本: 各位大佬能帮忙看看如何解决缓冲区溢出吗