使用智能指针(unique_ptr)发生异常

鸟类学 2016-08-30 02:51:44
程序报错为:Invalid address specified to RtlValidateHeap( 00220000, 01057631 )

调用堆栈位置:
> msvcr100d.dll!_CrtIsValidHeapPointer(const void * pUserData) 行 2036 C++
msvcr100d.dll!_free_dbg_nolock(void * pUserData, int nBlockUse) 行 1322 + 0x9 字节 C++
msvcr100d.dll!_free_dbg(void * pUserData, int nBlockUse) 行 1265 + 0xd 字节 C++
mfc100d.dll!operator delete(void * p) 行 347 + 0xc 字节 C++
mfc100d.dll!operator delete[](void * p) 行 360 + 0x9 字节 C++
xxx.dll!std::default_delete<unsigned char [0]>::operator()(unsigned char * _Ptr) 行 2084 + 0xf 字节 C++
xxx.dll!std::unique_ptr<unsigned char [0],std::default_delete<unsigned char [0]> >::_Delete() 行 2531 C++
xxx.dll!std::unique_ptr<unsigned char [0],std::default_delete<unsigned char [0]> >::~unique_ptr<unsigned char [0],std::default_delete<unsigned char [0]> >() 行 2474 C++
单步在函数返回时发生异常 ,求大神指点一二。
...全文
572 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
鸟类学 2016-09-05
  • 打赏
  • 举报
回复
引用 12 楼 CharlesSimonyi 的回复:
xxx.dll? 你这个项目有没有使用dll?
EncryptPack 和 foo函数 在同一个dll里
encoderlee 版主 2016-09-04
  • 打赏
  • 举报
回复
xxx.dll?
你这个项目有没有使用dll?
鸟类学 2016-09-04
  • 打赏
  • 举报
回复
引用 10 楼 iyomumx 的回复:
因为没有 EncrytPack 的信息,只能做出一点猜测: 1.该函数的返回值是否需要你去 delete —— 有的库会自己管理自己分配的内存,这种情况下,你没有指针的所有权,不应由你来释放该指针指向的内存(这里是 unique_ptr 的析构函数) 2.该函数的返回值是否需要调用某个库函数来释放——就像 Win32 API 有 HeapFree/CoTaskMemFree 等函数一样,一些库会使用特殊的内存分配器,文档应该会提出需要使用某个特定的函数来释放内存 3.该函数是否是在和你的代码不同的模块中,且两个模块的编译选项不一致——很多时候 new/delete 的实现会因编译器和编译选项的不同而不同,这种情况下 new/delete 应该在同一个模块下完成,或者调整各个模块的编译器和编译选项一致。
unsigned char* EncrytPack (......)//的实现如下: { //..... unsigned char*pPack = new unsigned char[wCMDTotalLen]; //... return pPack; } 调用EncryptPack函数为foo()。 foo(..)//实现如下 { //.... unsigned char *pCMDPack = Server::EncrytPack(lParam,CMD_GETMENUPRICE,NULL,wCMDDataSectLen,&wCMDRealLen); unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack); //.....位置2 return ....//这时出现了上面描述的错误情况。 } 我在代码里测试时 在位置2的地方声明了两个变量就没有问题了。。。。。。但是还是不知道具体错在哪里 虽然EncryptPack 和 foo函数在两个不同的文件 ,但是编译是一起的。
鸟类学 2016-08-31
  • 打赏
  • 举报
回复
引用 8 楼 lianshaohua 的回复:
Server::EncrytPack()返回的并不是char [],而是一个char *指针;这里面是有区别的,可以理解吗?
我觉得char[]和char*这两个类型应该没有问题吧。 EncrytPack 里返回的是(unsigned char*pPack = new unsigned char[wCMDTotalLen];) 的pPack,我现在就是想EncryPack外管理,我太明白 这里又申请了一个堆数组 unique_ptr<unsigned char[]>(new unsigned char[1024]()); ,这里我的pPack怎么管理?
ztenv 版主 2016-08-31
  • 打赏
  • 举报
回复
Server::EncrytPack()返回的并不是char [],而是一个char *指针;这里面是有区别的,可以理解吗?
鸟类学 2016-08-31
  • 打赏
  • 举报
回复
引用 6 楼 lianshaohua 的回复:
[quote=引用 5 楼 sbfksmq 的回复:]
unsigned char *pCMDPack = Server::EncrytPack(lParam,CMD_GETMENUPRICE,NULL,wCMDDataSectLen,&wCMDRealLen);
		unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack);
EncrytPack是在函数内申请了一个堆的数组
unsigned char*pPack = new unsigned char[wCMDTotalLen];
unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack); 改为:unique_ptr<unsigned char[]> unique_pCmdPack=unique_ptr<unsigned char[]>(new unsigned char[1024]());[/quote] 我想用智能指针来管理在EncryPack函数里申请的堆内存,但智能指针是在EncryPack函数外来使用。。。。。。
iyomumx 2016-08-31
  • 打赏
  • 举报
回复
因为没有 EncrytPack 的信息,只能做出一点猜测: 1.该函数的返回值是否需要你去 delete —— 有的库会自己管理自己分配的内存,这种情况下,你没有指针的所有权,不应由你来释放该指针指向的内存(这里是 unique_ptr 的析构函数) 2.该函数的返回值是否需要调用某个库函数来释放——就像 Win32 API 有 HeapFree/CoTaskMemFree 等函数一样,一些库会使用特殊的内存分配器,文档应该会提出需要使用某个特定的函数来释放内存 3.该函数是否是在和你的代码不同的模块中,且两个模块的编译选项不一致——很多时候 new/delete 的实现会因编译器和编译选项的不同而不同,这种情况下 new/delete 应该在同一个模块下完成,或者调整各个模块的编译器和编译选项一致。
ztenv 版主 2016-08-30
  • 打赏
  • 举报
回复
引用 5 楼 sbfksmq 的回复:
unsigned char *pCMDPack = Server::EncrytPack(lParam,CMD_GETMENUPRICE,NULL,wCMDDataSectLen,&wCMDRealLen);
		unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack);
EncrytPack是在函数内申请了一个堆的数组
unsigned char*pPack = new unsigned char[wCMDTotalLen];
unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack); 改为:unique_ptr<unsigned char[]> unique_pCmdPack=unique_ptr<unsigned char[]>(new unsigned char[1024]());
鸟类学 2016-08-30
  • 打赏
  • 举报
回复
unsigned char *pCMDPack = Server::EncrytPack(lParam,CMD_GETMENUPRICE,NULL,wCMDDataSectLen,&wCMDRealLen);
		unique_ptr<unsigned char[]> unique_pCmdPack(pCMDPack);
EncrytPack是在函数内申请了一个堆的数组
unsigned char*pPack = new unsigned char[wCMDTotalLen];
yshuise 2016-08-30
  • 打赏
  • 举报
回复
析构出错,不要用数组。数组用法不一样。
ztenv 版主 2016-08-30
  • 打赏
  • 举报
回复
贴代码出来看看
Enter空格 2016-08-30
  • 打赏
  • 举报
回复
肯定是你用法出错了。 新手搞不明白的话,建议使用shared_ptr别用unique_ptr
pengzhixi 2016-08-30
  • 打赏
  • 举报
回复
你是不是传递了一个指向栈上的指针给他了?

65,186

社区成员

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

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