随笔分类 -  visual c++

摘要:在计算机科学中,内存泄漏(memory leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏与许多其他问题有着相似的症状,并且通常情况下只能由那些可以获得程序源代码的程序员才可以分析出来。然而,有不少人习惯于把任何不需要的内存使用的增加描述为内存泄漏,严格意义上来说这是不准确的。 一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显式释放的内存。应用程序一般使用malloc 阅读全文
posted @ 2012-11-09 13:14 郑文亮 阅读(379) 评论(0) 推荐(0) 编辑
摘要://========================================================================//TITLE://malloc、realloc和new你明白了么?//AUTHOR://norains//DATE://Saturday05-January-2008//Environment://VS2005 +SDK-WINCE5.0-MIPSII//EVC + SDK-WINCE5.0-MIPSII//====================================================================== 阅读全文
posted @ 2012-11-09 10:43 郑文亮 阅读(881) 评论(0) 推荐(0) 编辑
摘要:LPTSTR GetBuffer( int nMinBufLength );nMinBufLength为buffer的字符长度,不包括结束符返回CString对象的内部buffer指针,非const,可以修改CString内容void ReleaseBuffer( int nNewLength = -1 );nNewLength为新的字符串长度,-1表示维持当前字符串长度释放多余内存注意点:调用CString的任何其他member function之前,必须先调用ReleaseBuffer,否则可能会出错!(因CString的内容改变了,而其长度未作相应修改,ReleaseBuffer完成此工 阅读全文
posted @ 2012-11-09 10:08 郑文亮 阅读(1198) 评论(0) 推荐(0) 编辑
摘要:先 转载一段别人的文章CString类的这几个函数, 一直在用, 但总感觉理解的不够透彻, 不时还有用错的现象. 今天抽时间和Nico一起分析了一下, 算是拨开了云雾: GetBuffer和ReleaseBuffer是一套需要配合使用的函数, 与GetBufferSetLength相比, 优点是如果分配的空间大于实际保存的字符串(0结尾), ReleaseBuffer会把多余申请的空间释放, 归还给系统; 但使用时需要注意以下问题: 如果要保存的字符串为abc(0结尾), 则GetBuffer参数应至少为3; 如果要保存的内容不是以0结尾, 比如是读取文件数据, 则GetBuffer参数如果大 阅读全文
posted @ 2012-11-09 09:28 郑文亮 阅读(5314) 评论(0) 推荐(0) 编辑
摘要:CString内存泄露的解决办法 收藏 8W~9tE+L9k-dI St引文:在多数情况下,比较简单的使用过程中,MFC的这个BUG不会发作,也就是不会有内存泄露。那什么时候CString会暴露出BUG那?U8N#Rwq我以前出现错误的经验是:如果多次调用带有CString引用的参数的函数(形如:funstr(CString &str);这样的函数),在一定的时候(和字符串长度有关系),CString的内部引用记数器发生记数混乱,造成内存泄露。_+^%bJc J8V,^a!dH8ZRgFJ 应为vc6.0在CString类的包装上的“小问题”,CStri 阅读全文
posted @ 2012-11-09 09:11 郑文亮 阅读(8308) 评论(1) 推荐(1) 编辑
摘要:用过C言语的人都知道每一个C的程序都会有一个main函数,但有时看别人写的程序却出现了_tmain,会感动很困惑。我当时也是很困惑,于是上网找资料看。现在将我得到的结果总结一下。因为并没有什么根据,如果有误。欢迎指正:_tmain与main的区别1。 main是C程序的函数,_tmain是main为了支持unicode所使用的main的別名2。 _tmain的定义在<tchar.h>可以找到,如#define _tmain main,所以要加#i nclude <tchar.h>才能用。_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main() 阅读全文
posted @ 2012-11-09 08:49 郑文亮 阅读(1721) 评论(0) 推荐(1) 编辑
摘要:摘要本文分析了Windows环境使用MFC调试内存泄露的技术,介绍了在Windows环境下用VC++查找,定位和消除内存泄露的方法技巧。关键词:VC++;CRT 调试堆函数;试探法。编译环境VC++6.0技术原理检测内存泄漏的主要工具是调试器和 CRT 调试堆函数。若要启用调试堆函数,请在程序中包括以下语句: #define CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注意 #include 语句必须采用上文所示顺序。如果更改了顺序,所使用的函数可能无法正确工作。 通过包括 crtdbg.h,将 mallo 阅读全文
posted @ 2012-11-08 17:10 郑文亮 阅读(643) 评论(0) 推荐(0) 编辑
摘要:VC 工程char* p = NULL;extern "C" _declspec(dllexport) char* _stdcall output_number(char* aa){ CString s = aa;s += "abcd";int nlen = s.GetLength();if(p != NULL){delete[] p;p = NULL;}p = new char[nlen + 1];p[nlen] = 0;memcpy(p,s.GetBuffer(0),s.GetLength());return p;} extern "C&q 阅读全文
posted @ 2012-11-08 17:09 郑文亮 阅读(1435) 评论(0) 推荐(1) 编辑
摘要:怎么理解CString & 类型?在函数参数表中,列了一项是此类型,据说是引用。可以给个具体方法,示例么?由于子程序调用是栈传递参数,因此对参数的修改不会改变调用者传入的参数的值。如果要改变调用者的参数值C语言一般用指针。但指针使用起来不是很方便,可能不清楚指针的意义是传入输入缓冲区首地址,还是需要输出的参数值。C++使用引用用就让这一意义更清楚。比如bool WriteStringIntoStruct(const char* szSource, mystruct *StructInstance );前一个指针是要读取的内存首地址,后一个是要改变的结构的实例的指针。如果这个函数写成 b 阅读全文
posted @ 2012-11-08 13:52 郑文亮 阅读(2014) 评论(0) 推荐(1) 编辑
摘要:<string>是C++标准库头文件,包含了拟容器class std::string的声明(不过class string事实上只是basic_string<char>的typedef),用于字符串操作。<cstring>是C标准库头文件<string.h>的C++标准库版本,包含了C风格字符串(NUL即'\0'结尾字符串)相关的一些类型和函数的声明,例如strcmp、strchr、strstr等。<cstring>和<string.h>的最大区别在于,其中声明的名称都是位于std命名空间中的,而不是后者的全 阅读全文
posted @ 2012-11-08 11:24 郑文亮 阅读(4187) 评论(0) 推荐(0) 编辑
摘要:Cstring好像是MFC类库中的。string好像是C++ 标准库中的继续追问:那他们的作用是一样的吗?补充回答:是一样的,在不同的场合,各有各的优点。CString能与MFC类库的其他类,有机完美的结合起来。可以方便的使用MFC。其他答案(1)CString 是MFC或者ATL中的实现,string是C++标准库中的实现string和CString均是字符串模板类,string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中; CString(typedef CStringT<TCHAR, StrTraitMFC<TCHAR>> CString)为Vis 阅读全文
posted @ 2012-11-08 11:22 郑文亮 阅读(1342) 评论(0) 推荐(1) 编辑
摘要:这几天经常用到的,不如记下吧。这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差。string是使用STL时必不可少的类型,所以是做工程时必须熟练掌握的;char*是从学习C语言开始就已经和我们形影不离的了,有许多API都是以char*作为参数输入的。所以熟练掌握三者之间的转换十分必要。以下我用简单的图示指出三者之间的关系,并以标号对应转换的方法。1 string to CStringCString.format("%s",string.c_str());2 CString to stringstring str(CSt 阅读全文
posted @ 2012-11-08 11:11 郑文亮 阅读(387) 评论(0) 推荐(0) 编辑
摘要:作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的。STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现。本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情。 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是B.. 阅读全文
posted @ 2012-11-08 10:23 郑文亮 阅读(427) 评论(0) 推荐(0) 编辑
摘要:C/C++指令 #undef ,#ifdef, #ifndef,#if的用法 收藏 #undef #undef 是在后面取消以前定义的宏定义 该指令的形式为 #undef 标识符 其中,标识符是一个宏名称。如果标识符当前没有被定义成一个宏名称,那么就会忽略该指令。 一旦定义预处理器标识符,它将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。 在此程序中,我们将取消在先前程序中对预处理器的定义。 源代码: #define TRACE(x) #if DBG #undef TRACE #define TRACE(x) g_TraceCallbac... 阅读全文
posted @ 2012-11-08 09:28 郑文亮 阅读(1339) 评论(0) 推荐(0) 编辑
摘要:malloc函数百科名片本词条主要介绍 malloc 函数Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。目录函数简介函数声明函数的工作机制举例说明编辑本段函数简介 原型:extern void *malloc(unsigned int num_bytes); 头文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 与 malloc.h 的内容是完全一致的),而在Visual C++6.0中可以用malloc.h或者st.. 阅读全文
posted @ 2012-11-08 09:24 郑文亮 阅读(8075) 评论(0) 推荐(0) 编辑
摘要:sprintf函数的功能与printf函数的功能基本一样,只是它把结果输出到指定的字符串中了,看个例子就明白了:例:将"test 1 2"写入数组s中#include<stdio.h> int main(void) { char s[40];sprintf(s,"%s%d%c","test",1,'2'); /*第一个参数就是指向要写入的那个字符串的指针,剩下的就和printf()一样了你可以比较一下,这是向屏幕输入 printf("%s%d%c","test",1, 阅读全文
posted @ 2012-11-08 08:45 郑文亮 阅读(12809) 评论(1) 推荐(0) 编辑
摘要:PB是一种面向C/S方式的数据库应用程序的开发工具,PB拥有数据窗口、嵌入式SQL语句等技术,在开发数据库应用程序时显得特别方便。但在涉及到系统底层的一些功能时,PB本身提供的功能就有些不尽如人意。因为Windows操作系统提供给用户的接口是C语言函数形式,而VC在调用系统底层功能方面,从编程角度来讲就要方便得多。VC还有许多PB所不具备的优点,比如数据结构表达能力强,实现复杂算法的程序相对容易开发,运行速度快等。此外,不少外围设备的驱动程序提供的也是C接口。若能将这两种语言结合起来使用,充分发挥它们各自的优点,将会大大提高开发效率、增强应用程序的功能。动态链接库简述动态链接库(Dynamic 阅读全文
posted @ 2012-11-07 16:54 郑文亮 阅读(3240) 评论(0) 推荐(0) 编辑
摘要:网上关于MFC下、及非MFC检测内存泄露的方法很多,当然都是基于陈旧的VC++6.0版本的,虽然和对我用处不大,但是只是让我明白了几点:1.非MFC下需要自己动手添加编写内存检测代码,MFC下其调试输出窗口就可以显示是否有内存泄露问题;2.显示内存泄露的时候,一般有两种情况:(1)指明泄露代码语句:g:\circle\2010227\flameui\0901_flamedetect_multhread\flamedetect\flamedetectdlg.cpp(312) : {96352} normal block at 0x02D16928, 256 bytes long.Data: &l 阅读全文
posted @ 2012-11-07 16:43 郑文亮 阅读(1469) 评论(1) 推荐(1) 编辑
摘要:今天运行了一段程序: 1 #include "stdafx.h" 2 3 4 int _tmain(int argc, _TCHAR* argv[]) 5 6 { 7 8 9 return 0;10 }11 void f(int x,int y)12 {13 15 int *q=&(x++);16 17 18 }没有编译过去报错说:“&”要求左值!开始学习:1.关于++a和a++的故事实际运算:++a等价于 a=a+1而 a++等价于(t=a;a=a+1,t);基本意思就是说所以t这个东西是个临时的东西放到哪了?我们来看一下汇编指令:1 7: ... 阅读全文
posted @ 2012-11-07 14:43 郑文亮 阅读(712) 评论(0) 推荐(0) 编辑
摘要:一:使用delete删除new分配的数组是要注意的事项 1.不要使用delete释放不是new分配的内存 2.不要使用delete释放同一内存块两次(也就是同一指针变量) 3.如果用new[]分配内存分配内存侧用delete[]释放内存二:指针小结 1.声明指针 要声明特点类型的指针如下面格式 int *pi; double *pd; 2.给指针赋值 应将内存地址赋予指针,可以对变量名用&操作符,来获取命名的内存地址,new操作符返回 未命名的内存地址。 int pa=3; pi=&pi; //赋予的地址而不是值 pd=new char;3.解除指针引用对指针解除引用意味着获取 阅读全文
posted @ 2012-11-07 14:27 郑文亮 阅读(1010) 评论(2) 推荐(0) 编辑