• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 大家看看下边的代码有什么问题?

大家看看下边的代码有什么问题?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了迅雷看看错误代码,迅雷看看错误代码0x,迅雷看看错误代码0x5,源代码迅雷看看,神秘代码迅雷看看等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 大家看看下边的代码有什么问题?
描述:

前些天遇到一个问题,俺试验了很长时间才解决,但还不清楚为什么。
使用一个类CMyADO来封装ADO连接对象,ADO的连接对象使用智能指针
在程序的不同地方,不同线程中来调用CMyADO的 GetConn方法
运行后发现,引用计数总是错的(使用BoundsChecker),多出来许多。
最后,俺把智能指针换成原生指针解决了这个问题。但不知道为什么会这样。
dx们出手看看,俺的代码是否有问题?
实际的使用环境比这个复杂得多,抽象出来代码如下……问题现象依然。
class CMyADO  
{
public:
_ConnectionPtr GetConn();
BOOL CloseAndFree();
BOOL Open();
CMyADO();
virtual ~CMyADO();
_ConnectionPtr m_spADOCN;
};
BOOL CMyADO::Open()
{
HRESULT hr;
_bstr_t cn=L"Provider=SQLOLEDB.1;....";
hr=m_spADOCN.CreateInstance (L"ADODB.Connection");
m_spADOCN->Open(cn,"","",adConnectUnspecified);
return true;
}
BOOL CMyADO::CloseAndFree()
{
m_spADOCN->Close;
m_spADOCN.Release ();
return true;
}
_ConnectionPtr CMyADO::GetConn()
{
return m_spADOCN;
}
//****************************************
int test()
{
CMyADO myAdo;
myAdo.Open();
IDispatch* pDisp=NULL;
myAdo.GetConn()->QueryInterface (IID_IDispatch,(void**)&pDisp);
         //...
pDisp->Release ();
myAdo.CloseAndFree ();
return 0;
}
int main(int argc, char* argv[])
{
CoInitialize(NULL);
test();
CoUninitialize();
return 0;
}


解决方案1:

虽然你的代码很不好,因为很少采用_ConnectionPtr作返回值的,就像通常采用LPCTSTR作返回值而不用CString一样。
但是你确信它内存泄漏吗?我从来不相信各种内存泄漏检查工具,还是靠自己检查好一些。AddRef,Release不是返回一个引用计数吗?你应该用这个返回值来确认是否内存泄漏。
我粗略一看没有啥泄漏,你先用检查一下Release()的返回值再说吧。

解决方案2:

myAdo.Open();//***//
IDispatch* pDisp=NULL;
myAdo.GetConn()->QueryInterface (IID_IDispatch,(void**)&pDisp);//***//
         //...
带星的两行代码互换一下如何?


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 在线等帮我看看下面代码那些错误地方的应该怎么改呀?在线等
  • 看看这个代码怎么了。
  • 狂散分,请把我看看代码,为什么总是出错?
  • 看看这段代码有什么问题?
  • 谁来帮我看看下面的代码
  • 大家看看下边的代码有什么问题?

相关文章

  • 2017-06-04 IWebBrowser与OleDraw
  • 2017-06-04 请问如何在IDL文件中可以使用Windows重定义的数据类型
  • 2017-06-05 线程中调用DLL函数的问题
  • 2017-06-04 ocx中如何画出button
  • 2017-06-04 内存报错,ECX为0
  • 2017-06-04 direct90DirectInputCreateEx无法得到链接问题
  • 2017-06-05 请教:(Win2000下)如何修改指定进程的内存数据?谁有这样的源代码?谢谢!
  • 2017-06-05 事件和线程这两个概念帮忙说一下阿,搞不清了谢谢
  • 2017-06-04 我偷偷的问,COM你们公司在用吗?
  • 2017-06-04 救救菜鸟,vc和vb写com有什么区别啊

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • CDTPicker获取年份错误!
    • 弱问:::关于deleteCWinThread对象
    • 如何获取excel合并单元格的列数
    • 百分求:vc调用Office2003的方法
    • vista下如何实现音量控制与获取终端设备音量改变事件的回调函数
    • 用什么方法可以控制变量的访问时间那?谢谢!
    • 程序自动重启问题
    • 继续开帖咨询ocx嵌套ocx问题
    • 急:如何将一个类封装成为dll文件?在def文件中怎么写?:::::在线等待:::::
    • 用ShellExecute来执行另外一个程序的时候可以控制吗?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有