用户操作
[即时聊天] [发私信] [加为好友]
王卫星ID:wangweixing2000
58853次访问,排名1795好友68人,关注者201
爱好:足球,健身,看电影.
wangweixing2000的文章
原创 70 篇
翻译 0 篇
转载 41 篇
评论 44 篇
星的公告
知识共享,快乐coding!! 千里之行﹐始於足下! Locations of visitors to this page
最近评论
hailongxl://修改employee密码
extern "C" XDATAMANAGER_API int __stdcall DBChangePassword(const char *user,const char*pass)
{
#if USE_SQLITE
if( db == NULL )return X_DB_NOT_INIT;

……
lhtang:Program file does not exist
E:\S60\devices\S60_3rd_FP2_SDK_v1.1\epoc32\release\WINSCW\UDEB\first_syb_hello_0xE40082A0.exe not found

这是为什么?
lhtang:里面只是些zip压缩包,ide里是不是有个添加插件的界面,还有下的1.3的carbide打不开
wangweixing2000:http://www.forum.nokia.com/info/sw.nokia.com/id/48a93bd5-028a-4b3e-a0b1-148ff203b2b3/Extensions_plugin_S60_3rd_ed.html
这里去下载
lhtang:Extensions plug-in如何安装,里面没有安装文件,我邮箱tlhad@126.com,请赐教.
文章分类
收藏
相册
csdn友情连接
COM集中营
kennykerr的blog
休闲空间(RSS)
婉儿的blog(RSS)
数字金刚
推荐经典网站
Codeguru
CodeProject
我的网站
我的免费代码垃圾堆
我的网站
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 今天发现使用了很久的SQLite3原来忘记释放返回错误信息的buffer了!汗!收藏

新一篇: 转一篇关于字符集编码的文章,写得不错! | 旧一篇: 如何使用微软的SAPI实现发音功能?

今天对程序进程内存泄漏检查发现: Detected memory leaks! Dumping objects -> {814} normal block at 0x0370AFD0, 40 bytes long. Data: 74 61 62 6C 65 20 54 61 62 6C 65 5F 53 74 72 61 Object dump complete.
如果你写的程序没有返回错误信息,那么不应该会有泄漏!
 我的源代码:
 if (result == SQLITE_OK)
 {
char *errmsg = NULL;
int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK)
 {
 ATLTRACE( "创建表失败,错误码:%d,错误原因:%s\n", result, errmsg );
} //else cont.
}
跟了一下SQLite3的代码:
if( pStmt ) sqlite3_finalize(pStmt);
 if( azCols ) sqliteFree(azCols);
rc = sqlite3ApiExit(0, rc);
if( rc!=SQLITE_OK && rc==sqlite3_errcode(db) && pzErrMsg )
{
int nErrMsg = 1 + strlen(sqlite3_errmsg(db));
*pzErrMsg = sqlite3_malloc(nErrMsg); //这里进行申请buffer,如果不释放那漏洞大大的。
 if( *pzErrMsg )
{
memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg);
}
}
else if( pzErrMsg )
{
*pzErrMsg = 0;
}
assert( (rc&db->errMask)==rc );

改正后的代码:
if (result == SQLITE_OK)
 {
char *errmsg = NULL;
int nError = sqlite3_exec( m_sqlite3DB, "create table Table_StrangeWords( ID integer primary key autoincrement, name nvarchar(32) ,)", NULL, NULL, &errmsg ); if(nError != SQLITE_OK)
 {
ATLTRACE( "创建表失败,错误码:%d,错误原因:%s\n", result, errmsg );
}
//else cont.
//close
if(errmsg != NULL)
 {
sqlite3_free(errmsg); //这里需要用sqlite3_free去free,切忌!
 } //else cont.
 }
sqlite把内存管理自己封装起来,可不能随便delete这个buffer,遇到问题最好看看它的代码!

发表于 @ 2007年09月12日 14:58:00|评论(loading...)|收藏

新一篇: 转一篇关于字符集编码的文章,写得不错! | 旧一篇: 如何使用微软的SAPI实现发音功能?

评论

#taomic 发表于2008-07-08 19:32:18  IP: 220.189.195.*
malloc 后当然要free了.是你自己太粗心了.
#hailongxl 发表于2008-09-22 13:30:35  IP: 221.221.152.*
//修改employee密码
extern "C" XDATAMANAGER_API int __stdcall DBChangePassword(const char *user,const char*pass)
{
#if USE_SQLITE
if( db == NULL )return X_DB_NOT_INIT;

char *szError = NULL;
char sql[256];
sprintf(sql,"UPDATE employee SET employee_pass='%s' "
"WHERE employee_id='%s'",
pass?pass:"",user);

EnterCriticalSection(&g_criticalSection);
int result = sqlite3_exec( db,sql,NULL,NULL,&szError );
LeaveCriticalSection(&g_criticalSection);

if( result == SQLITE_OK )return X_DB_OK;
else
{
#ifdef _UNICODE
traceline(L"DBChangePassword:%S\n",szError);
#else
traceline("DBChangePassword:%s\n",szError);
#endif
sqlite3_free(szError);
return X_DB_EXECUTE_FAILED;
}
#endif
}
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 星