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="<
new/delete单个对象以及数组注意事项
*对自定义类型需要严格配对 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重载
new/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/delete全局重载
new=>::new=>malloc=>create;//分配内存优先于构造函数
decreate=>free=>::delete=>delete;//析构函数优先于释放内存
全局与局部new/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"<
list数据结构及双链表
list的应用
要了解c++的list实现细节可以参考C++链表的C实现(查找中间节点、判断是否存在环)
#include
#include
#include
using namespace std;
int main()
{
list mylist{1,2,3,4,5};
mylist.push_back(10);
for(auto i : mylist){
cout<
链表归并、交换,双链表及多链表
归并merge()
list mylist1{1,2,3,4,5};
list mylist2{6,7,8,9,0,10};
mylist1.merge(mylist2);
for(auto ib = mylist1.begin(), ie = mylist1.end();ib!=ie;ib++){//正序
cout<<*ib<
交换swap()
list mylist1{1,2,3,4,5};
list mylist2{6,7,8,9,0,10};
mylist1.swap(mylist2);
for(auto ib = mylist1.begin(), ie = mylist1.end();ib!=ie;ib++){//正序
cout<<*ib<
多链表
list mylist1{11,12,33,4,5};
list mylist2{6,17,8,12,9,0,10};
list mylist3{6,17,8,12,9,0,10};
list> mylist{mylist1,mylist2,mylist3};
for(auto i : mylist){
for(auto j :i){
cout<
双链表管理一个类对象
类对象即使是空指针可以访问代码区函数,但是如果该函数访问局部变量,会因为没分配内存空间报错:
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 myClasslist;//双链表数据结构,管理一个类所有对象
class MyClass{
public:
void showMessage(){
cout<<"hello"<showMessage();
}else{
//对象数组的第一个地址是数组名,要跳过
for (int j=0; j
要是创建树结构
struct ClassInfo{
MyClass *p;
int n;
char name[10];//类的名称
};
list> myTree;



