本文共 2648 字,大约阅读时间需要 8 分钟。
如果你是Java、C#、PHP程序员,那么会对 new 非常熟悉,在这些编程语言中,只能通过 new 来创建对象。在C++中,你可以像定义变量一样来创建对象,如:Student stu; //对象已被实例化,已分配内存空间,可以使用了 stu.say(); //调用成员函数
Student stu; //对象已被实例化,已分配内存空间,可以使用了stu.say(); //调用成员函数
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;}
#includeusing namespace std; class Demo{ public: Demo(); ~Demo(); }; Demo::Demo(){ cout<<"Constructor"<
#includeusing 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