找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 170|回复: 6

动态数组中的数据大量操作后内存地址似乎变化

[复制链接]

23

主题

29

回帖

190

积分

注册会员

积分
190
QQ
发表于 2025-1-2 01:36:49 | 显示全部楼层 |阅读模式
悬赏1金钱未解决
动态数组中存放自定义类时,大量操作后似乎这个自定义类的地址变动了

1、我尝试将一个常用的功能封装成了类(这个类定义我放在了另外一个共用的  .xc文件中)
2、然后将一堆数据封装成了一个结构体,
3、我尝试创建一个类型为上述结构体的动态数组(结构体声明和数组声明及调用放在一起,同一个.xc文件中),并尝试动态的赋值和调用  数组[x].自定义类.方法X()

但是我发现似乎刚生成是可以正常调用,去操作一些其他事件之后,再回头来调用就似乎会导致动态数组中的自定义类的地址变动,进而导致程序无法正常进行,且程序将崩溃。

具体报错形如:【错误: 线程尝试读取不可访问的数据, 错误码: 0xC0000XXX,线程ID: XXXXX, 异常地址: 0x0000XXX, 不可访问虚拟地址: 0x0000XXX;*可查看[调用堆栈]定位错误位置】

请问应该如何这个问题呢?

  1. 结构体 部件信息
  2.         文本型 部件名称
  3.         文本型 要求列表
  4.         文本型 计价规则
  5.         文本型 图片列表
  6.         文本型 注意事项
  7.         详细信息类 详细信息
复制代码
  1. 类 详细信息类
  2.         私有
  3.         文本型 _标题前缀
  4.         布局框架类 绘制目标
  5.         JSON对象 JS对象
  6.         整型 基础对象数
  7.         整型 内容高度 = 30
  8.         整型 活动组件标记
  9.         逻辑型 启用编辑
  10.         // 根据组件JSON动态创建组件,并返回组件句柄给

  11.         函数 事件 整型 绑定热键(元素句柄 来源句柄, 附加参数1 wParam, 附加参数2 lParam, 逻辑型* 是否拦截)
  12.                 处理常用热键(来源句柄, wParam)
  13.                 返回 0

  14.         函数 事件 整型 处理鼠标左键双击事件(元素句柄 来源句柄, 正整型 标识, 点结构* 鼠标位置, 逻辑型* 是否拦截)
  15.                 //如果处于编辑商品界面,则推送信息到对应组件
  16.                 如果 (启用编辑)
  17.                         
  18.                         文本型 当前运算名 = A2W_(JS对象.取成员对象(活动组件标记).取对象(A"运算名").取文本值())
  19.                         如果 (当前运算名 == "")
  20.                                 消息框("当前前组件没有运算名,请先设置一下吧", "添加失败")
  21.                                 返回 0
  22.                         否则
  23.                                 元素句柄 代码编辑框句柄 = (元素句柄)炫彩_取对象从名称(_标题前缀 + "运算逻辑_代码编辑框")
  24.                                 如果 ((整型)代码编辑框句柄 != 0)
  25.                                         编辑框_插入文本(代码编辑框句柄, 编辑框_取当前行(代码编辑框句柄), 编辑框_取当前列(代码编辑框句柄), "[" + 当前运算名 + "]")
  26.                                         //窗口_置焦点(取窗口句柄(取HWND(), 0), 代码编辑框句柄)
  27.                                         窗口_置焦点(窗口组件_取窗口句柄((炫彩句柄)代码编辑框句柄), 代码编辑框句柄)
  28.                 返回 0
复制代码

23

主题

29

回帖

190

积分

注册会员

积分
190
QQ
 楼主| 发表于 2025-1-2 01:50:28 | 显示全部楼层
经过测试 似乎在程序入口处,增加如下代码可以明显改善问题,但是感觉这样好像没有根本性解决问题。
动态数组.置大小(100)
动态数组.置大小(0)

58

主题

112

回帖

717

积分

版主

积分
717
发表于 2025-1-2 19:19:23 | 显示全部楼层
动态数组增删成员时会修改内存,类放动态数组需要以指针的形式加入,只有普通数据结构或基础类型才能直接放

23

主题

29

回帖

190

积分

注册会员

积分
190
QQ
 楼主| 发表于 2025-1-2 19:52:27 | 显示全部楼层
hxznhf 发表于 2025-1-2 19:19
动态数组增删成员时会修改内存,类放动态数组需要以指针的形式加入,只有普通数据结构或基础类型才能直接放 ...

我好像没有正确理解,我昨天也尝试这样修改了  但是会导致直接不能正常调用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

58

主题

112

回帖

717

积分

版主

积分
717
发表于 2025-1-2 20:23:15 | 显示全部楼层
竹永玉 发表于 2025-1-2 19:52
我好像没有正确理解,我昨天也尝试这样修改了  但是会导致直接不能正常调用。 ...

首先:涉及指针,你可能还需要再学学
然后:我刚刚回答的可能有点问题,如果你把一个局部变量类加入数组后,数组里面的那个类和局部变量那个类已经没有任何关系了,你局部变量做的操作和它没任何关系,所以我让你换指针类型,指针类型需要使用 new方法创建,不能光定义指针类型变量,如果你搞不懂就先加入成员,然后通过数组访问成员后再做其它操作,还不清楚加官方群3咨询

23

主题

29

回帖

190

积分

注册会员

积分
190
QQ
 楼主| 发表于 2025-1-2 21:50:41 | 显示全部楼层
hxznhf 发表于 2025-1-2 20:23
首先:涉及指针,你可能还需要再学学
然后:我刚刚回答的可能有点问题,如果你把一个局部变量类加入数组 ...


感谢耐心解答
“涉及指针,你可能还需要再学学”的确如此,我之前没接触过相关知识 ,之前个别出现单个出现时我尝试切换不一样的写法还可以偶尔蒙对,但是始终不太明白原理,现在学习不太清楚应该查找什么资料。


“如果你把一个局部变量类加入数组后,数组里面的那个类和局部变量那个类已经没有任何关系了,”这个是我贴出的代码有点问题 ,我其实最终操作的还是数组成员,定义的那个局部变量其实相当于是多写出来一句没有意义的无用代码,这个后续再检查到时我删除了 局部变量的定义。

“指针类型需要使用 new方法创建,”  我在手册中找到了  关于New()  函数 的相关介绍,但是阅读后根据我当前的理解认为在定义这个动态数组指针时似乎需要同时确定这个变量的下标,而我实际是需要动态添加和删除的,提前定义下标似乎只能照着大了定义,着和初衷相悖。稍后我修改代码尝试后如果再有疑问在群里直接提问。  再次感谢

66

主题

280

回帖

1277

积分

管理员

积分
1277
发表于 2025-1-3 14:01:25 | 显示全部楼层
动态数组, 如果是成员是类,  存指针, 因为数组大小改变, 是会重新分配内存的,  导致地址改变
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|炫语言 | 炫彩界面库 | 用户所需, 正是我所做! ( 鄂ICP备2023014763号-1 )

GMT+8, 2025-2-5 14:04 , Processed in 0.075343 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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