new/delete与malloc/free区别
基本数据类型:int, char, short, long, double…及数组自定义类型myDatanew/delete单个对象以及数组注意事项new分配内存,静态区栈堆 new/delete重载
new/delete局部重载new/delete全局重载全局与局部new/delete分析 list数据结构及双链表
list的应用链表归并、交换,双链表及多链表双链表管理一个类对象 new/delete与malloc/free区别 基本数据类型:int, char, short, long, double…及数组
int *p = new int(5); cout<<" p="< class mydata{public://c++ class 默认private,如果都不写,系统会自动分配为两个public空的构造、析构函数 void *p; mydata(){//构造 p = malloc(1024*1024*100); cout<<"mydata create"<
*对自定义类型需要严格配对 new []/ delete []或者new/delete。
int *p = new int[3]{1,2,3};cout<
new分配内存,静态区栈堆char str[1024] = { 0 };//内存全局静态区int main(){// char str[1024] = { 0 };//栈区// char *str = new char[1024]{ 0 };//堆区 int *p = new int[3]{1,2,3};//一定在堆区 int *p1 = new (str) int[3]{1,2,3};//分配内存,指定为str开始的地址 cin.get(); return 1;}
c++ new分配内存可以指定内存区域,一定程度上继承了unix系统的优良特性,Windows经常奔溃,Linux次之,Unix最为稳定,而Linux为android底层,Unix为iOS底层,这也是iOS较android更稳定的原因。这也是多数银行系统采用Unix做为服务系统的原因。
静态区栈堆的内存都可以覆盖重写,而唯独堆区内存可以delete重新利用。
单例的new/delete重载
int objs = 0;//全局变量用于统计void *g_p = nullptr;//全局指针实现单列using namespace std;//无法被堆上创建的类class mydata{public://c++ class 默认private,如果都不写,系统会自动分配为两个public空的构造、析构函数 mydata(){//构造// objs++; cout<<"mydata create"<
new=>::new=>malloc=>create;//分配内存优先于构造函数
decreate=>free=>::delete=>delete;//析构函数优先于释放内存
全局重载不完全,objs统计有问题
void * operator new (size_t size){ objs++; cout<<"g_new call"<
局部重载,objs统计可以放在构造和析构函数
static int objs = 0;void *g_p = nullptr;using namespace std;class mydata{public://c++ class 默认private,如果都不写,系统会自动分配为两个public空的构造、析构函数 void *p; mydata(){//构造 p = malloc(1024*1024*100); cout<<"mydata create"<
也可以放在new/delete、new[]/delete[]里
static int objs = 0;void *g_p = nullptr;using namespace std;class mydata{public://c++ class 默认private,如果都不写,系统会自动分配为两个public空的构造、析构函数 void *p; mydata(){//构造 p = malloc(1024*1024*100); cout<<"mydata create"<
要了解c++的list实现细节可以参考C++链表的C实现(查找中间节点、判断是否存在环)
#include #include #include
归并merge()
list
交换swap()
list
多链表
list
类对象即使是空指针可以访问代码区函数,但是如果该函数访问局部变量,会因为没分配内存空间报错:
class MyClass{public: int i=0; void show(){// Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)// i = 2; messages_base(); } my};int main(){ MyClass *myClass(nullptr); myClass->show();//代码区共享可以访问 return 1;}
对于类来说:类的函数共享,数据则是每个类对象私有的,空对象调用成员函数,没有访问数据,可以调用,访问数据不可以。
class MyClass;struct Info{ MyClass *p; int n;};list
要是创建树结构
struct ClassInfo{ MyClass *p; int n; char name[10];//类的名称};list> myTree;