博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类和new、delete操作符
阅读量:4223 次
发布时间:2019-05-26

本文共 2648 字,大约阅读时间需要 8 分钟。

如果你是Java、C#、PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象。在C++中,你可以像定义变量一样来创建对象,如:
 
Student stu;  //对象已被实例化,已分配内存空间,可以使用了 
stu.say(); //调用成员函数
Student stu;  //对象已被实例化,已分配内存空间,可以使用了stu.say();  //调用成员函数
这种情况下,系统会在栈区为对象分配内存。栈区是内存中的一块区域,由系统自动分配和释放,程序员无法操控,一般用来存放函数的参数值、局部变量、局部对象等。
当发生函数调用时,系统将函数参数、局部变量、局部对象依次压入栈区;函数执行结束,再按照先进后出的原则将它们弹出(销毁)。
对于大部分程序,这不会有什么问题。但当你希望在函数调用结束前销毁对象时,你是无能为力的。或者你希望通过 for 循环来创建多个对象,这种方法同样也做不到。
这个时候 new 和 delete 就派上了用场:使用 new 创建的对象,可以在任意时刻通过 delete 销毁,而且只需要一个指针指向它。
以前面的 Student 类为例,可以这样来动态创建对象:
new Student;
也可以使用构造函数:
new Student("小明", 15, 90.5f);
这样,就在堆区为对象分配了内存,并调用了构造函数。
但是此时程序员还无法访问这个对象,因为这个对象既没有名字,也没有指针指向它。这种对象称为
匿名对象,它确实存在,但无法访问。
用一个指针来指向Student类的对象:
Student *pStu;pStu = new Student("小明", 15, 90.5f);
或者:
Student *pStu = new Student("小明", 15, 90.5f);
当不再需要对象时,可以通过 delete 销毁:
delete pStu;
这样,就释放掉了对象占用的内存,并调用了析构函数。
需要说明的是:new 在堆区为对象分配内存。与栈区不同的是,堆区内存由程序员分配和释放,系统不会自动销毁,即使函数调用结束了,仍然会保留堆区内存。如果程序员不主动回收堆区内存,那么只能在程序运行结束后由操作系统回收。
为了避免内存泄露,强烈建议 new 和 delete 成对出现,及时销毁不再需要的对象。
例如,下面的代码会造成严重的内存泄露:
 
#include 
#include
using namespace std;
 
class Demo{
private:
double n;
double m;
int i;
};
 
void func(){
Demo *p = new Demo;
}
 
int main(){
int i;
for(i=1; i<=1000000; i++){
func();
}
system("pause");
return 0;
}
#include 
#include
using namespace std;class Demo{private: double n; double m; int i;};void func(){ Demo *p = new Demo;}int main(){ int i; for(i=1; i<=1000000; i++){ func(); } system("pause"); return 0;}
当程序运行到 system("pause"); 语句时,你可以打开任务管理器,会发现这个小小的程序竟然占用了 32M 内存。
这是因为每次调用 func 函数,都会创建一个对象,并用 p 指向它。函数运行结束,仅仅释放了指针变量 p 占用的内存,而没有释放 p 所指向的对象占用的内存。
如果在 func 函数中不回收对象内存,那么你将永远无法回收,只能等到程序运行结束由操作系统回收,这就是典型的内存泄露。
另外注意,C语言中的 malloc、free 函数不能用来为对象分配和释放内存。请看下面的例子:
 
#include 
using namespace std;
 
class Demo{
public:
Demo();
~Demo();
};
Demo::Demo(){
cout<<"Constructor"<
#include 
using namespace std;class Demo{public: Demo(); ~Demo();};Demo::Demo(){ cout<<"Constructor"<

运行结果:

------new------
Constructor
Constructor
Constructor
Constructor
Constructor
Constructor
------malloc------
------delete------
Destructor
Destructor
Destructor
Destructor
Destructor
Destructor
------free------
从程序运行结果可以看出:malloc 虽然分配了内存,但没有调用构造函数;free 虽然释放了内存,但也没有调用析构函数。

转载:http://c.biancheng.net/cpp/biancheng/view/2980.html

你可能感兴趣的文章
【屌丝程序的口才逆袭演讲稿50篇】第五篇:不要给自己找任何借口【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第七篇:请留意我们身边的风景 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第八篇:坚持的力量 【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第九篇:春节那些事-过年回家不需要理由【张振华.Jack】
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十一篇:马云乌镇40分钟演讲实录【张振华.Jack】
查看>>
Java并发编程从入门到精通 张振华.Jack --我的书
查看>>
【屌丝程序的口才逆袭演讲稿50篇】第十二篇:世界上最快的捷径【张振华.Jack】
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
《浪潮之巅》1 AT&T
查看>>
《浪潮之巅》2蓝色巨人 IBM公司
查看>>
《浪潮之巅》3水果公司的复兴
查看>>
《浪潮之巅》4计算机工业的生态链
查看>>
《浪潮之巅》5奔腾的芯 英特尔公司
查看>>
python语言程序设计基础笔记(三)从题目到方案
查看>>
读取txt文件出现出现多余空行问题
查看>>
从理论到实践开发自己的聊天机器人
查看>>
@***装饰器(python)
查看>>
我的2020
查看>>
2.3 WSN的MAC协议
查看>>