c++内存管理

  一直觉得内存管理是个大头,c语言里面最大两个问题,内存管理和指针,到了c++,内容就比较精彩了,也无外乎四个东西,内存管理,指针,设计模式,泛型。下面就第一个说说值得注意的东西吧

 (1)c语言中四个存储的区域,本blog的上一篇文章即是转载他人的相关文章,比较了堆和栈的区别,并加入了少量本人的注释
 (2)内存泄露(free,delete)、内存区域未初始化(随机,非为0)、内存越界(申请内存未成功、野指针和数组越界)的问题
 (3)数组和指针的对比

 其实高质量c/c++编程里面有详细的讲述,也可以见如右的网页:c++内存管理

 下面是我的相关注释

char *p="hello";
p[0]='X';
printf("%s",p);
//strcmp就相当于把二者指针的内容相减
原型:extern int strcmp(const char *s1,const char * s2);
所在头文件:string.h
功能:比较字符串s1和s2。
一般形式:strcmp(字符串1,字符串2)
说明:
当s1<s2时,返回值= -1
当s1==s2时,返回值= 0
当s1>s2时,返回值 = 1

   ps:sizeof(1)数组和指针

   参考网址:sizeof()用法汇总
    sizeof(p)其中p是指针,所有指针变量的sizeof 操作结果均为4

sizeof(a)其中a是数组名,这就要分两种情况:a是作为函数参数,退化为指针,为4,但是如果是一般情况,那就是整个数组占多大就是多大

比较经典的辨析题

      double* (*a)[3][6]; 
      cout<<sizeof(a)<<endl; // 4 a为指针
      cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
      cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
      cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
      cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量

           数组也是一个指针,没加上一个*实际维数就减少1,特别在多维数组里面更明显,在上面,a是一个二维数组指针(a前面的*决定的),并且这个二维数组是一个指针数组(这是由于double后面的*决定的),那么,总共算起来从内层到外层就有四个*(本来内外各一个,再加上二维就是4个,而且蜕皮的顺序也是由内而外)

sizeof short:2

sizeof long:4
sizeof float:4

sizeof WORD:2

sizeof DWORD:4

原因

WINDEF.H的定义

typedef unsigned long       DWORD;

typedef int                 BOOL;

typedef unsigned char       BYTE;

typedef unsigned short      WORD;

再ps下,上诉网页中关于最后sizeof(s4)作者的判断有误,为24

再再ps:发现上面的讲诉缺了点神马,然后再引述一个sizof函数的相关网页

 size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof( char ),foo()并不会被调用

C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:

sizeof( foo ); // error
void foo2() { }
sizeof( foo2() ); // error,没有返回值
设置没有对其的命令#pragma pack(2) // 必须在结构体定义之前使用
这个#pragma命令又有点说头了:#pragma百度百科
其中作者用过的两种:
一种是加载dll文件 #pragma comment(dll,"a.dll"),还有#pragma once

(4)指针传递内存

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"); // 运行错误
}//上述无法得到内存,由于传递不是指针的指针
void GetMemory2(char **p, int num)
{
	*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
	char *str = NULL;
	GetMemory2(&str, 100); // 注意参数是 &str,而不是str
	strcpy(str, "hello");
	cout<< str << endl;
	free(str);
}



 

 
发布了31 篇原创文章 · 获赞 21 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章