- 浏览: 78904 次
- 性别:
- 来自: 西安
文章列表
#include <io.h>
#include <afx.h>
BOOL fnCreateDirectory(CString csFilePath, CString &csErr)
{
if(csFilePath.IsEmpty())
{
csErr.Format("directory argument is empty\r\n");
return FALSE;
}
if(-1 != _access(csFilePath, 0))
{
return TRUE;
}
int pos = 0;
CString c ...
Ctrl+s 存盘
Ctrl+/ 注释(取消)代码
Ctrl+shift+/ 注释代码块
Ctrl+shift+\ 取消代码块
Alt+/ 代码辅助/调出IF语句等程序模板:使用方法:打出if,按ALT+/
Ctrl+D 删除一行
Ctrl+Shift+D 在 debug 模式里显示变量值
Ctrl+1 快速修复 ...
参考知识:
操作系统中的堆和栈
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大
数据结构中的堆和栈
还有就是 ...
分析一下代码
char *GetString2(void)
{
char *p = "hello world";
return p;
}
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
这段代码是可以正常运行的,GetString2返回了只读的内存块,在Test5里面应该是可以访问"hello world"字符串的,在Test5里面对str的任何操作,都是在操作"hello world",所以 ...
7、对象数组
class Obj
{
public :
Obj(void);
Obj(int x);
}
void Test(void)
{
Obj *a = new Obj;
Obj *b = new Obj(1);
delete a;
delete b;
}
如果用new创建对象数组,那么只能使用对象的无参数构造函数。例如
Obj *objects = new Obj[100]; // 创建100个动态对象
不能写成
Obj *objects = new Obj[100](1);//创建100个动态对象的同时赋初值1
在用delete释放对象数组时,留意不要丢了符号' ...
4、计算内存容量
用运算符sizeof可以计算出数组的容量(字节数)。如下实例(a)中,sizeof(a)的值是12(注意别忘了空字符'\0'),指针p指向a,但是 sizeof(p)的值却是4,这是因为sizeof(p)得
到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量,C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下实例(b)中,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)
实例(a)计算数组和指针的内存容量
char a[] ...
含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽
动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)
(5)释放了内存却继续使用它
(11)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面
(12)函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁
(13)使用free或delete释放了内存后,没 ...
1、内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,
但是分配的内存容量有限
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使
用非常灵活,但问题也最多
2、常见的内存错误及其对策
(1)内存分配未成功 ...
在javascript获取系统时间,并给当前时间月份加3,怎么获取3个月后的时间
var d = new Date();
d.setMonth(d.getMonth()+3);
alert(d);
在C++中用const来定义常量,可以替换#define,const与指针一起使用:
1、"指向常量的指针"是指一个指向常量的指针变量,它不允许改变指针所指的常量,由于它是一个普通指针变量,不是常指针,因此可以改变其指向,如下代码:
cont char *name = "teser";
name[2] = 'A'; //错误,不允许修改指针所指的常量
name = "Mytester"; //正确,可以改变指针的指向
2、"常指针"是指把指针本身,而不是它指向的对象声明为常量,创建一个常指针,就是创建一个不能移 ...
1. 设计一个函数:void find1(char array[], char search, char * pi)
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。
设计:依题意,实现代码如下。
void find2(char [] array, char search, char ** ppa)
{
int i;
for (i=0;*(array+i)==0,i++)
{
if ( ...
示例4.3 用函数返回值来传递动态内存
用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例4.4。
char *GetString(void)
{
char p[] = "hello world";
return p; // 编译器将提出警告
}
void Test4(void)
{
char *str = NULL;
str = GetString(); // str 的内容是垃圾
cout<< str <&l ...
4、指针参数是如何传递内存的?
如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello&q ...
function loadScript(src) {
var script = document.createElement("script");
script.type = "text/javascript";
script.src = src;
document.body.appendChild(script);
}
loadscript(scriptpath);
假定一个指针指向一个int变量,它保存着这个int变量在内存中存储的地址,同样,函数也有地址,这是因为函数的机器语言实现
是由载入到内存的代码组成,指向函数的指针中保存着函数代码起始处的地址
void ToUpper(char *) //函数原型
void (*pf) (char *) //函数指针
void *ph (char *); //返回指针的函数(指针函数)
声明一个指向特定函数类型的指针,首先声明一个该类型的函数,然后用(*pf)形式的表达式代替函数名称,pf就成为可指向那种
类型的函数的指针了;有了函数指针之后,可以把适当类型的函数的地址赋给它,函数名可以用来表示函数的地址,如 ...