new和malloc都是在对上开辟内存,但尽量使用new。
使用malloc的注意事项:(1)程序猿必须实现确定对象的长度;(2)malloc返回一个void*指针,赋值给其他类型时,必须进行强转;(3)malloc可能申请内存失败,所以必须判断返回值来确保内存分配成功;(4)不会调用构造函数,但使用对象之前必须对它初始化;(5)和free配合使用。
C++解决动态内存分配的方案是把对象所需要的操作都结合在一个称为new的运算符里,当new创建一个对象时,直接返回该类型的指针,它在堆里为对象分配内存并调用构造函数完成初始化,和delete配合使用。
1 Person *p = new Person; 2 3 //相当于4-8行代码 4 Person *p = (Person*)malloc(sizeof(Person)* 100); 5 if (NULL == p){ 6 return; 7 } 8 (*p).str = "abc"; 9 10 delete p; 11 if (p != NULL){ 12 free(p); 13 p = NULL; 14 }
注意事项:void*接收new出来的指针,会出现释放问题,不会调用析构函数
new堆区开辟数组,一定会调用默认构造函数,所以一定要提供默认构造;栈区开辟数组,可以指定有参构造
1 Person *p = new Person("abc"); //表示调用有参构造初始化 2 delete p; 3 4 Person *p1 = new Person[10]; //堆上开辟数组,调用默认构造函数,必须提供默认构造(程序猿不能只提供有参构造,会覆盖) 5 delete[] p1; 6 7 Person p2[10] = { Person("123"), Person("456") };//栈上开辟内存,可以指定有参构造 8 delete[] p2;