C++的new和delete表达式
2014-05-18 19:59
309 查看
定义变量时,必须指定其数据类型和名字,而创建动态对象时只需要指定其数据类型,而不必为该对象命名
int i;
int *pi=new int;
这个new表达式在自由存储区中分配创建了一个整形对象,并返回次兑现光额地址,并用改地址初始化Pi;
1.动态创建的对象可以用初始化变量的方式实现初始化:
int i(2024);
int *pi=new int(2024);
string s(10,'9');
string s=new string(10,‘9’);
2.动态数组的默认初始化
如果不显示的初始化,动态创建的对象与在函数内定义的变量初始化的方式相同。类类型就用自己默认的构造函数初始化,而内置类型如果不显示的初始化那就没有初始化,所以,内置类型一般显示的初始化。
如int*pi=new int();//初始化为0
3.撤销动态创建对象
C++提供了delete表达式释放指针所指向的内存空间。
delete pi;
该指令释放了指针pi指向的int行对象所占用的内存空间。
如果指针指向的不是new分配的内存地址,则该指针傻姑娘使用delete是不合法的。
4.在delete之后重设指针的值
执行语句;
delete pi;
后,pi变成不确定的指针。在很多机器上,尽管pi值没有明确的定义,但仍然存放了他之前所指向对象的地址,然而pi所指向的内存已经释放,因此pi不在有效。
删除指针后,该指针变为悬垂指针。悬垂指针指向曾经存放对象的内存,但是该对象已经不复存在了。悬垂指针往往导致编译错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不在指向任何对象。
警告:
常见的三种程序错误都与动态内存分配有关;
(1)删除delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态内存失败称为内存泄露。
(2)读写已经删除了的对象。将删除指针所指向的对象之后将指针设置为0则比较容易检测出此类问题。
(3)对同一内存块使用两次delete表达式。当两个指针指向同一个动态创建的对象删除时就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时自由存储区就有可能被破坏。
int i;
int *pi=new int;
这个new表达式在自由存储区中分配创建了一个整形对象,并返回次兑现光额地址,并用改地址初始化Pi;
1.动态创建的对象可以用初始化变量的方式实现初始化:
int i(2024);
int *pi=new int(2024);
string s(10,'9');
string s=new string(10,‘9’);
2.动态数组的默认初始化
如果不显示的初始化,动态创建的对象与在函数内定义的变量初始化的方式相同。类类型就用自己默认的构造函数初始化,而内置类型如果不显示的初始化那就没有初始化,所以,内置类型一般显示的初始化。
如int*pi=new int();//初始化为0
3.撤销动态创建对象
C++提供了delete表达式释放指针所指向的内存空间。
delete pi;
该指令释放了指针pi指向的int行对象所占用的内存空间。
如果指针指向的不是new分配的内存地址,则该指针傻姑娘使用delete是不合法的。
4.在delete之后重设指针的值
执行语句;
delete pi;
后,pi变成不确定的指针。在很多机器上,尽管pi值没有明确的定义,但仍然存放了他之前所指向对象的地址,然而pi所指向的内存已经释放,因此pi不在有效。
删除指针后,该指针变为悬垂指针。悬垂指针指向曾经存放对象的内存,但是该对象已经不复存在了。悬垂指针往往导致编译错误,而且很难检测出来。
一旦删除了指针所指向的对象,立即将指针置为0,这样就非常清楚的表明指针不在指向任何对象。
警告:
常见的三种程序错误都与动态内存分配有关;
(1)删除delete指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态内存失败称为内存泄露。
(2)读写已经删除了的对象。将删除指针所指向的对象之后将指针设置为0则比较容易检测出此类问题。
(3)对同一内存块使用两次delete表达式。当两个指针指向同一个动态创建的对象删除时就会发生错误。如果在其中一个指针上做delete运算,将该对象的内存空间返还给自由存储区,然后接着delete第二个指针,此时自由存储区就有可能被破坏。
相关文章推荐
- 【C++】new和delete表达式与内存管理
- C++基础知识学习:new与delete表达式
- C++学习之new 与 delete表达式
- c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- 关于C++中的new 和 delete
- 关于C++当中new和delete操作符重载的一些感想
- C++中有了malloc/free,为什么还需要new/delete?
- C++内存管理基础之new & delete
- c++中的new/delete
- C++中的内存管理(new、delete、内存泄漏)
- C++中有了malloc/free,为什么还要用new/delete
- 浅析C++中的 new 与 delete 操作
- C++中令人混淆的3个new和delete
- c++中new和delete的使用方法
- new and delete 表达式
- C++内存管理基础之new & delete
- new和delete表达式
- C++学习笔记之1:使用相同形式的new和delete
- C++学习笔记之1:使用相同形式的new和delete