欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

c++复习笔记——4、指针与内存管理

时间:2023-06-02
文章目录

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 []或者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"<void * operator new (size_t size){ objs++; cout<<"g_new call"<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"<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;

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。