dll内new和delete的问题求助

mrpeterchen 2011-03-05 09:59:57
DLL文件中有这么个函数:

bool FetchFirstDevCnts(/*[out]*/char *firstDev,/*[out]*/ unsigned int *Count)
{
printf("进入调用模块!\n\n");
unsigned int i = 0;
pcap_if_t *firstdev = NULL;
pcap_if_t *d = NULL;
char errbuf[256];

firstdev = new pcap_if_t();
d = new pcap_if_t();
if(NULL == firstdev)
{
// strcpy_s(PEle,sizeof(errbuf),"Initilize point failure!");
return false;
}
printf("开始find all devices!\n\n");
if(pcap_findalldevs(&firstdev,errbuf)<0)
{

assert(memcpy(firstDev,errbuf,sizeof(errbuf)));
fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
return false;
}


assert(memcpy(firstDev,firstdev,sizeof(firstdev)));
for(d=firstdev;d;i++)
{
printf("开始循环查找设备!\n\n");
if(NULL == d)
{
break;
}
d=d->next;
}
printf("结束循环查找设备!\n\n");
Count = &i;
printf("开始释放设备!\n\n");
pcap_freealldevs(firstdev);
if(NULL != firstdev)
{
printf("正在释放设备!\n\n");
delete firstdev;
firstdev = NULL;
}
printf("结束释放设备!\n\n");
return true;

}

调这个DLL中的这个函数时,报assertion failed

调试了下,出错是在 delete firstdev语句;

求教这个错误背后是什么原因?
我该怎么解决?

谢谢大家
...全文
162 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎碎念 2011-03-08
  • 打赏
  • 举报
回复
这点代码看不出具体的问题,我感觉这句代码pcap_freealldevs(firstdev);已经将firstdevs释放掉了(从函数的名字理解),随后在free就会出错...如果在pcap_freealldevs(firstdev);内将firstdev释放掉而没有firstdev=NULL;就会进入下个if(firstdev!=NULL){这里在free firstdev就会抛出异常}
mrpeterchen 2011-03-08
  • 打赏
  • 举报
回复
lanxue_1988
你说的对,freealldev应该是已经做了释放,再delete或者free就有问题.
freealldev没有把指针指向空,会不会出现野指针的问题,我需要加上point = NULL;??

再请教个问题,以前书上常说,指针最好初始化,那这里不new没关系吗?
pengzhixi 2011-03-07
  • 打赏
  • 举报
回复
for(d=firstdev;d;i++)//d的指向被改变,原来的内存泄露丢失了。如果firstdev是一个栈变量,崩溃时必然的
npuhuxl 2011-03-07
  • 打赏
  • 举报
回复
if(pcap_findalldevs(&firstdev,errbuf)<0)
pcap_findalldevs看看这个函数是否会给firstdev赋值
mrpeterchen 2011-03-06
  • 打赏
  • 举报
回复
哦? 指针不NEW下也可以用吗?
npuhuxl 2011-03-06
  • 打赏
  • 举报
回复
如果这样的话,应该可以这样
bool FetchFirstDevCnts(/*[out]*/char *firstDev,/*[out]*/ unsigned int *Count)
{
printf("进入调用模块!\n\n");
unsigned int i = 0;
pcap_if_t *firstdev = NULL;
pcap_if_t *d = NULL;
char errbuf[256];


printf("开始find all devices!\n\n");
if(pcap_findalldevs(&firstdev,errbuf)<0)
{

assert(memcpy(firstDev,errbuf,sizeof(errbuf)));
fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
return false;
}


assert(memcpy(firstDev,firstdev,sizeof(firstdev)));
for(d=firstdev;d;i++)
{
printf("开始循环查找设备!\n\n");
if(NULL == d)
{
break;
}
d=d->next;
}
printf("结束循环查找设备!\n\n");
Count = new unsigned int(i);
printf("开始释放设备!\n\n");
pcap_freealldevs(firstdev);

printf("结束释放设备!\n\n");
return true;

}
mrpeterchen 2011-03-06
  • 打赏
  • 举报
回复
pcap_if_t是个结构体

形式如下:

struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};

typedef struct pcap_if pcap_if_t;

pcap_findalldevs//这个函数是winpcap包提供的,具体实现我也不知道,只知道他用来获取所有可得的网卡信息,好像是链表形式,返回一个链表头的地址。。。

继续跪求高手帮忙~~~~~

小弟感激不尽~~

我的类中没有虚函数,请问虚函数有啥用,能解决这个问题吗?

咋用虚函数啊?

-。-


xiaohuh421 2011-03-05
  • 打赏
  • 举报
回复
pcap_if_t 这个类的析构出问题了吧.

如果这个类中的东西你不清楚,有没有虚函数,指针成之类的,就不能用内存自制,这样是不行的.
npuhuxl 2011-03-05
  • 打赏
  • 举报
回复
刚才把firstDev看成了firstdev,所以memcpy(firstDev,errbuf,sizeof(errbuf))应该不用管
npuhuxl 2011-03-05
  • 打赏
  • 举报
回复
这点代码是不能解决问题的。

pcap_findalldevs(&firstdev,errbuf)//可能会修改firstdev

memcpy(firstDev,errbuf,sizeof(errbuf)) //可能会缓冲区溢出,sizeof(pcap_if_t)是多少,有虚函数?

pcap_freealldevs(firstdev); // 这个函数功能不知,从名称上看也可能会调用delete firstdev

所以要想解决问题,把上面提到的代码贴出来才行

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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