请教关于动态库与内存分配问题,。

zly1980 2006-09-03 10:34:56
写了个SO文件,一个应用调用这个SO文件,
SO代码的H文件(应用也包含这个H文件)定义:
typedef struct Res_T
{
char *buf;
int Len;
}Res;

void /*一些导出声明省去*/__stdcall MyFunc(Res *res);
cpp:
void __stdcall MyFunc(Res *res)
{
//....这里得到数据
res->buf=(char *)malloc(1024);
strncpy(res->buf,xxx,1024);
res->len=1024;
}
void /*一些导出声明省去*/__stdcall FreeRes(Res *res)
{
if(res->buf!=NULL)
free(res->buf);
res->len=0;
}
在应用程序调用的时候,会出现奇怪的问题,有些地方(应用代码)用malloc分配内存失败,一直组塞在malloc处。也不出错,但是永远停在那。应用是在类定义处直接定义了个:Res res;调用SO的函数是:
MyFunc(&res);
FreeRes(&res);
后来我把那SO的H文件的定义修改成:
typedef struct Res_T
{
char buf[10240];
int Len;
}Res;
修改FreeRes的实现代码,把那free 去掉了.
再次编译SO和应用程序,之后就没有问题了。我仔细检查过应用有关内存操作部分,没有发现有数组越界,内存泄露的操作。而且在出现问题的时候,由于应用是多线程程序,在生成第一个任务线程的时候,那线程序把自己任务的所有代码执行完了一次,都没有发现问题;在生成第二个任务线程的时候,线程执行到某处的malloc处就停止了,经过多次调试,都是发生在第二个任务线程那,第三个线程也不会出现。并且一个任务线程要执行的代码是调用多次SO的MyFunc函数的。
...全文
267 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fytzzh 2006-09-04
  • 打赏
  • 举报
回复
res->buf=(char *)malloc(1024);
strncpy(res->buf,xxx,1024);
================================
上面的程序就有可能造成内存越界啊!看你的描述,就是这里的问题了。
1,malloc分配出来的内存是不清零的。需要调用memset(res->buf, 0, sizeof(res->buf));或
调用calloc分配内存。
2,当xxx的字符串长度大于res->buf的时候,res->buf的第res->buf[1023]不是'\0',而是xxx的某个字符。这样res->buf就越界了。可以如下修改:
memset(res->buf, 0, sizeof(res->buf));
strncpy(res->buf,xxx,1023);
playmud 2006-09-04
  • 打赏
  • 举报
回复
void __stdcall MyFunc(Res *res)
{
//....这里得到数据
if(res->buf==NULL)
....
res->buf=(char *)malloc(1024);
strncpy(res->buf,xxx,1024);
if(res->buf!=NULL) {
res->len=1024;
}
}
void /*一些导出声明省去*/__stdcall FreeRes(Res *res)
{
if(res->buf!=NULL)
free(res->buf);
res->buf=NULL;
res->len=0;
}

从你列出来的代码没有看到哪里存在问题,可能和你其他的地方的使用有关吧。
你增加一些判断看看
fytzzh 2006-09-04
  • 打赏
  • 举报
回复
不好意思。第len 个就是0。
zly1980 2006-09-04
  • 打赏
  • 举报
回复
照你说的,len是不包括0的长度 ,但是strncpy 的长度是len个字节啊,我分配的是len+1个字节,strncpy会在第N个字节写0的吧。
即使不会,我应用解析那BUF数据的时候都是正确的,没有出现错误啊,数据最终都是只读的,不会被修改的。真的郁闷得很,更加奇怪的是,我同事之前是:
void __stdcall MyFunc(Res *res)
{
char resultbuf[10240];
//得到数据
res->buf=resultbuf;
}
这样竟然运行了几个月,都没有出过错误……,NND,怎么我就那么黑
fytzzh 2006-09-04
  • 打赏
  • 举报
回复
int len=strlen(得到数据的指针);
res->buf=(char *)malloc(len+1);
strcpy(res->buf,xxx,len);
=========================================
还是有问题啊!len是不包含0的长度。你分配了len+1个字节,其中包含了0的长度。但strncpy的时候却copy了len个字节,0还是没有copy过去。malloc分配的是不清0的。res->buf的最后一个字节怎么保证是以0结尾呢?
zly1980 2006-09-04
  • 打赏
  • 举报
回复
我可以保证这里的内存是没有越界的!
因为实际是:
int len=strlen(得到数据的指针);
res->buf=(char *)malloc(len+1);
strcpy(res->buf,xxx,len);
下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。

23,223

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧