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

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.

    菜鸟之见,欢迎指正。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 赵4老师 2021-10-26 14:52
    关注

    string是对象,不是一段内存,不适合放在结构体中。

    评论
  • SYW# 2021-10-26 15:49
    关注

    一直没注意这方面,怪不得初始化数组得时候,有个提示呢,谢谢谢谢

    评论
  • SYW# 2021-10-28 15:33
    关注

    问题的关键是 “数组越界”!!“数组越界”!!“数组越界”!!解决方法得根据具体代码分析,我这里也只是我个人的例子。

    评论
查看更多回答(3条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 unity打光没有照亮物体
  • ¥25 powershell如何拷贝1周前的文件
  • ¥15 询问MYSQL查询SQLSERVER数据表并比较差异后,更新MYSQL的数据表
  • ¥15 关于#前端#的问题,请各位专家解答!
  • ¥15 最小生成树问题 Prim算法和Kruskal算法
  • ¥25 医院住院病人呼叫器设计
  • ¥15 不想和现在的团队合作了,怎么避免他们对程序动手脚
  • ¥20 C语言字符串不区分大小写字典排序相关问题
  • ¥15 关于#python#的问题:我希望通过逆向技术爬取1688搜索页下滑加载的数据
  • ¥15 关于Linux的终端里,模拟实现一个带口令保护的屏保程序遇到的输入输出的问题!(语言-c语言)