《C++高级编程》--有效的内存管理

来源:互联网 发布:简单的编程代码 编辑:程序博客网 时间:2024/06/15 19:47

1、在程序中使用动态内存有两个主要优点:
• 动态内存可以在不同的对象与函数之间共享
• 动态分配的内存空间大小可以在运行时确定

2、malloc、free和new、delete
• malloc和new的最大区别在于,new不仅会分配适当的空间,同时还会正确的构造对象;
class Foo;
Foo* myFoo=(Foo*)malloc(sizeof(Foo));
Foo* myOtherFoo=new Foo();
myFoo指向的对象并不是正确的对象,因为从来就没有构造过一个Foo类的对象,malloc只是分配了足够的内存空间来存放一个Foo类的对象;
myOtherFoo指向了一个Foo对象,因为new不仅分配了空间,并且还调用了Foo的构造函数。
• free和delete有类似的区别:使用free时,不会调用对象的析构函数;而delete却会调用对象的析构函数,并且会正确清除该对象。
• 内存分配失败时
如果new分配内存失败,就意味着没有足够的内存空间来处理请求。new会抛出一个异常,如果没有异常处理的话,程序会停止。
还有另外一个new版本,它不会抛出异常,而只是返回一个NULL:
int* ptr=new (nothrow) int;
虽然返回NULL不会让程序退出,但是还是没有很好的解决分配内存失败的原因。
• 在C++中,不要使用realloc(),因为realloc会按新容量分配一个内存块,把所有的旧数据按照“按位复制”移到新的位置,但是在C++中,用户定义的对象不能很好的进行按位复制。
• 使用数组语法声明的数组可以通过指针来访问。把数组传递给函数时,总是作为指针类传递的。

3、字符串
• 在C语言中,字符串表示为字符数组,字符串的最后一个字符是null字符'/0';常见的错误就是忘记给'/0'分配空间。
• 字符串直接常量:cout<<"hello"<<endl;其中的"hello"就是字符串直接常量,被看作const char* .
• 由于兼容性可以调用string.c_str()来转化成C风格的字符串
• 将一个指针减去同类型的另一个指针,所得到的是两个指针之间的元素个数,而不是两个指针之间的绝对字节数。

4、函数指针
函数指针根据参数类型和兼容函数的返回类型来确定类型。使用函数指针最容易的方法是使用typedef来为一组给定特征的函数赋一个类型名。
typedef bool (*funcPtr)(int,int);
funcPtr表示一个函数指针,该指针指向有两个int参数且返回bool类型的任意函数。
函数名也可以代表函数的地址,还可以使用'&'来显式的获得函数的地址。

5、内存泄漏
内存泄漏的查找可以使用专业的软件包,也可以使用免费的valgrind.

6、智能指针
智能指针的概念源于这样一个事实:如果把一切都放到栈中,这样就可以避免与内存相关的大部分问题。因为在栈中一旦超出了作用域,就会
自动消除。
智能指针的基本理论十分简单,它是带有一个关联指针的对象,当智能指针超出作用域的时候,会删除关联的指针。本质上讲,
就是在一个基于栈的对象内部包装一个堆对象。

原创粉丝点击