各位大佬能帮忙看看如何解决缓冲区溢出吗
刚开始学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;
}
单从你贴出的这段代码没看出什么问题。把完整代码发出来看看?
//开辟新空间
Worker** newSpace = new Worker * ;
改成
//开辟新空间
Worker** newSpace = new Worker; ryosga 发表于 2022-6-9 15:21
//开辟新空间
Worker** newSpace = new Worker * ;
这样不行,直接报错了
严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E0144 "Worker *" 类型的值不能用于初始化 "Worker **" 类型的实体
错误(活动) E0604 不允许使用抽象类 "Worker" 数组
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();
};
看到一个解决方法但是不知道为什么
将
//开辟新空间
Worker** newSpace = new Worker * ;
改成
Worker** newSpace = new Worker * ; this->m_EmpNum 有没有可能这个成员没有初始化随机值是负数, 然后你直接使用?
或者参数有没有可能是负数? newSize 的结果有没有可能是负数或者0?
因为看你这里是申请了 newSize 个成员, newSize 是 this->m_EmpNum + addNum 得来的
检查一下 this->m_EmpNum 和 addNum 这两个有没有问题
至少看你贴出来的代码是没有溢出的
而且你确定就是溢出而不是其他问题吗?
运行时IDE有什么提示吗? 福仔 发表于 2022-6-9 21:37
this->m_EmpNum 有没有可能这个成员没有初始化随机值是负数, 然后你直接使用?
或者参数有没有可能是负数? ...
我用的vs2022,运行是没有问题但是会出现警告溢出
警告 C6386 写入 "newSpace" 时缓冲区溢出。
SLCoCo 发表于 2022-6-9 17:12
整个放不上来超出文件大小了,跟他有关联的是这两个头文件
#pragma once
#inclu ...
还是得需要看实现才行。你调试的时候看看this->m_EmpNum、addNum的值。 SLCoCo 发表于 2022-6-9 19:25
看到一个解决方法但是不知道为什么
将
//开辟新空间
这个修改可以是因为申请的空间变大了, newSpace是数组,数组里面存放的Worker*即Worker指针。改成这样Worker** newSpace = new Worker * ;后newSpace数组的大小变成了newSize*sizeof(Worker),而之前newSpace数组的大小为newSize。
页:
[1]
2