SYW# 2021-10-25 15:02 采纳率: 40%
浏览 56
已结题

C++动态创建数组报错:“读取访问权限冲突”

工具:VS2019
问题描述:
我用C++创建了一个DLL,DLL里主要是一个“Punch_Menual”类,
(1)类里面申明了一个结构体(结构体的具体定义是在类外面写的)

////XXXE.h
#pragma once
#include <iostream>
using namespace std;
class _declspec(dllexport) Punch_Menual;
class Punch_Menual
{
public:
    Punch_Menual();   //构造函数
    void getnum();
    void fun();

public:
    int i_max = 0;

public:
    struct Ceshi;
    Ceshi* ceshi_Arr ;      //需要动态获取数组的空间大小,所以这里定义指针数组

};
struct Punch_Menual::Ceshi
{
    string name;
    string size;

    //...
};

(2)然后,在cpp中调用类里面的成员函数,去初始化数组

////"XXXE.cpp"中
#include "pch.h"
#include "XXXE.h"
Punch_Menual::Punch_Menual()
{

}
void Punch_Menual::getnum()
{
    //......一些列操作得到 i_max 的值
    i_max = 7;
}
void Punch_Menual::fun()
{    
    ceshi_Arr = new Ceshi[i_max];
    ceshi_Arr[0].name = "1号";
    ceshi_Arr[1].name = "2号";
    ceshi_Arr[2].name = "3号";
    ceshi_Arr[3].name = "4号";
    ceshi_Arr[4].name = "5号";

}

img

(3)到这里,“编译”、“生成解决方案”都没有报错,也能成功的生成DLL,然后新建一个MFC的EXE项目调用,

    ////测试数组
    Punch_Menual Punch;
    Punch.fun();
    string str;
    str = Punch.ceshi_Arr[0].name + "\r\n" + Punch.ceshi_Arr[1].name + "\r\n" + Punch.ceshi_Arr[2].name + "\r\n" + Punch.ceshi_Arr[3].name + "\r\n" + Punch.ceshi_Arr[4].name;
    MessageBox(str.c_str() );

就会报错:

img

请高人帮忙指点一下,在下先谢过了!!

  • 写回答

4条回答 默认 最新

  • SYW# 2021-10-28 15:28
    关注

    问题解决了,到"ceshi_Arr = new Ceshi[i_max];"都是没问题的,出问题在后面的赋值上,我这里贴出来的代码是我重新组织的(跟我出问题的代码差不多过程,说来也奇怪,这段代码也报差不多的错),网上查了一些资料,大概感觉是数组越界之类。
    我就去原代码中看什么地方有可能造成越界,我原来代码是在while里赋值的,whle语句里套了小while,小while 里面是用istingstream将字符串按空格分段再取值的,但是我一不小心把i++写到小while 里面了,应该放在放外面的,就导致i++过多,就越界了

    
    
    //  大概过程如下所示:
    string str = "name:xiaoming age:18 subject:English";
    string s;
    istringstream issd(Toolfile_Line);
    while(...一个条件...)
    {
       //......
      while(issd>>s)
      {
          //...
          //...
          i++;     //就是这里错了,我应该把 i++放在最后的
      }
        ceshi_Arr[0].name = ...;
        ceshi_Arr[1].name  = ...;
        
        //应该把 i++ 放在这里
    }
    

    算是很低级的粗心错误,由于我代码有点长,一时没看出来,后来分段注释,才看出来。

    提一下上面大哥说的那个 string 不适合放在结构体中的事情,确实不适合,编译能通过,但是在相应string 类型变量的赋值语句下面有一条绿色的波浪线,鼠标放上去,会看到一个有关内存的警告:

    从”ceshi_Arr“中读取数据无效,可读大小为 ”(unsigned int)*100+4" 字节,但可能读取了”(unsigned int)*200" 字节
    

    我后来也测了一下,用string 赋值调用什么的都可以成功,也没有报错,但是我隐约觉得可能有什么隐患,后来把string 全部换成了char.

    菜鸟之见,欢迎指正。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 创建了问题 10月25日

悬赏问题

  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)的连乘积
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计