吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1839|回复: 12
收起左侧

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

[复制链接]
SLCoCo 发表于 2022-6-9 13:11
刚开始学C++,跟着B站的视频学发现这里
newSpace[this->m_EmpNum + i] = worker;
会出现缓冲区溢出,这是为什么?该如何解决?谢谢
[C++] 纯文本查看 复制代码
if (addNum > 0)
	{
		//计算新空间人数
		int newSize = this->m_EmpNum + addNum;

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

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

		//添加新数据
		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[this->m_EmpNum + i] = worker;

		}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

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

改成

        //开辟新空间
        Worker** newSpace = new Worker[newSize];
 楼主| SLCoCo 发表于 2022-6-9 17:03
ryosga 发表于 2022-6-9 15:21
//开辟新空间
        Worker** newSpace = new Worker * [newSize];

这样不行,直接报错了
严重性        代码        说明        项目        文件        行        禁止显示状态
错误(活动)        E0144        "Worker *" 类型的值不能用于初始化 "Worker **" 类型的实体
错误(活动)        E0604        不允许使用抽象类 "Worker" 数组
 楼主| SLCoCo 发表于 2022-6-9 17:12
FlyingFire 发表于 2022-6-9 13:44
单从你贴出的这段代码没看出什么问题。把完整代码发出来看看?

整个放不上来超出文件大小了,跟他有关联的是这两个头文件
[C++] 纯文本查看 复制代码
#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;
};

[C++] 纯文本查看 复制代码
#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 * [newSize];
改成
Worker** newSpace = new Worker * [newSize*sizeof(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
整个放不上来超出文件大小了,跟他有关联的是这两个头文件
[mw_shl_code=cpp,true]#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 * [newSize*sizeof(Worker)];后newSpace数组的大小变成了newSize*sizeof(Worker),而之前newSpace数组的大小为newSize。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 10:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表