Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by Struct ListNode
【C++】深入解析C/C++内存管理:new与delete的使用及原理-CSDN博客
最新推荐文章于 2024-09-03 11:06:17 发布 是店小二呀 最新推荐文章于 2024-09-03 11:06:17 发布 阅读量4.9k 收藏 177 点赞数 236 分类专栏: C++ 文章标签: c++ 开发语言 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 C++语法相关知识点可以通过点击以下链接进行学习一起加油! 命名空间 缺省参数与函数重载 C++相关特性 类和对象-上篇 类和对象-中篇 类和对象-下篇 日期类 本章将分享C++为何放弃malloc/free系列,选择新系列new/delete去管理内存。深度探索new/delete的使用及其原理,malloc/free系列与new/delete系列的不同之处。 🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C++笔记专栏: C++笔记 🌈初阶数据结构笔记专栏: 初阶数据结构笔记 🌈Linux笔记专栏: Linux笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 一、C/C++中程序内存区域划分 内存区域相关作用:...
数据结构--链表-CSDN博客
目录 SList.h SList.c test.c 一、链表的概念及结构 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。 ⻋厢是独⽴存在的,且每节⻋厢都有⻋⻔。想象⼀下这样的场景,假设每节⻋厢的⻋⻔都是锁上的状 态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾? 最简单的做法:每节⻋厢⾥都放⼀把下⼀节⻋厢的钥匙。 链表也是如此 与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点” 节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。 图中指针变量 plist保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希 望plist“指向”第⼆个节点时,只需要修改plist保存的内容为0x0012FFA0 为什么还需要指针变量来保存下⼀个节点的位置?...
C语言/数据结构--(用双链表实现数据的增删查改)-CSDN博客
一.前言 嗨嗨嗨,大家好久不见!前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改,现在让我们尝试一下使用双链表实现数据的增删查改吧! 二.正文 如同往常一样,对于稍微大点的项目来说,我们使用多文件操作更好一些。 #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; struct ListNode { DataType data; struct ListNode* prev; struct ListNode* next; }; typedef struct ListNode ListNode; void ListInit(ListNode** pphead);//双向链表初始化 void ListDestroy(ListNode* phead);//双向链表销毁 void ListPrint(ListNode* phead);//双向链表打印 void ListPushBack(ListNode* phead, DataType...
【链表-双向链表】-CSDN博客
1.链表的分类 单向or双向 带头or不带头 (一般会称d1为头节点,但实际上head这个哨兵节点才是头节点) 循环or不循环 综上所述,222共有8种链表 我们一般最常用的就是单链表和双链表。 单链表:不带头单向不循环链表 双向链表:带头双向循环链表 2.双向链表的 双向链表包含三个部分,: 1.数据 2.指向下一个节点的指针 3.指向上一个节点的指针 struct ListNode { int data; struct ListNode* next; struct ListNode* prev; } ps:单链表和双向链表的初始状态? 单链表为空链表 双向链表剩下一个头结点(即哨兵位) 2.2.1 初始化 方法一 void LTInit(LTNode** pphead); void LTInit(LTNode** pphead) { *pphead = LTBuyNode(-1); } 方法二 LTNode* LTInit(); LTNode* LTInit() { LTNode* phead = LTBuyNode(-1); return phead; } 打印双向链表...
C++:智能指针-CSDN博客
一、智能指针的使用及原理 在学习异常的时候,我们知道了由于异常的反复横跳可能会导致内存泄露的问题,但是对于一些自定类类型来说他在栈帧销毁的时候会去调用对应的析构函数,但是以下这种必须手动释放的场景,一旦抛出异常就会造成内存泄露的结果。 int div() { int a, b; cin >> a >> b; if (b == 0) throw invalid_argument("除0错误"); return a / b; } void Func() { // 1、如果p1这里new 抛异常会如何? // 2、如果p2这里new 抛异常会如何? // 3、如果div调用这里又会抛异常会如何? int* p1 = new int; int* p2 = new int; cout << div() << endl; delete p1; delete p2; } int main() { try { Func(); } catch (exception& e) { cout << e.what() << endl; } return 0; }...
【C++初阶】第五站:C/C++内存管理 (匹配使用,干货到位)
前言: 本文知识点: 1. C/C++内存分布2. C语言中动态内存管理方式3. C++中动态内存管理4. operator new与operator delete函数 5. new和delete的实现原理 (干货在此) 6. 定位new表达式(placement-new)7.
【C++】C/C++内存管理详解-CSDN博客
个人主页 : zxctscl 文章封面来自:艺术家–贤海林 如有转载请先通知 1. 前言 在之前的C语言中就有提到动态内存管理 【C语言】动态内存管理,那么在C++中又是怎么样的呢?话不多说,正文开始。 2.
数据结构->带你深入了解单链表(基础篇)-CSDN博客
✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青-CSDN博客 前面我们学习了顺序表,今天我们来学习与顺序表类似的单链表 1.🍎什么是链表 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 链表的结构跟⽕⻋⻋厢相似,淡季时⻋次的⻋厢会相应减少,旺季时⻋次的⻋厢会额外增加⼏节。只需要将⽕⻋⾥的某节⻋厢去掉/加上,不会影响其他⻋厢,每节⻋厢都是独⽴存在的。 ⻋厢是独⽴存在的,且每节⻋厢都有⻋⻔。想象⼀下这样的场景,假设每节⻋厢的⻋⻔都是锁上的状 态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾? 最简单的做法:每节⻋厢⾥都放⼀把下⼀节⻋厢的钥匙。 那在在链表⾥,每节“⻋厢”是什么样的呢? 与顺序表不同的是,链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点” 节点的组成主要有两个部分: 当前节点要保存的数据和保存下⼀个节点的地址(指针变量)。 图中指针变量...
DAY4两两交换链表中的节点&删除链表的倒数第N个节点&链表相交&环形链表II-CSDN博客
两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 1.画图做题:curr的位置为要翻转的两个节点的前一个节点。 2.返回的是虚拟头节点的下一个节点。所以对于A B C D来说,curr = dummyNode;curr指向B, 3.确定循环条件: 因为是两两交换,所以偶数时能完全交换,则curr.next为空时就停止循环;若为奇数,没完全交换,则curr.next.next为空时终止; 且循环条件的顺序是 while(cur->next != nullptr && cur->next->next != nullptr) ,防止cur->next已经为空了,cur->next->next报空指针异常 curr初始指向虚拟头节点。 class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点...
C/C++内存管理学习【new】-CSDN博客
在学习之前我们先看一下下面这些代码都分布在哪里? int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); } 选择题: 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区) globalVar在哪里?C staticGlobalVar在哪里?C staticVar在哪里?C localVar在哪里?A num1 在哪里?A...
【C++干货铺】 RAII实现智能指针
========================================================================= 个人主页点击直达:小白不是程序媛 C++系列专栏:C++干货铺 代码仓库:Gitee ========================================================================= 目录 RAII std::auto_ptr std::unipue_ptr std::shared_ptr 为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题? int div() { int a, b; cin >> a >> b; if (b == 0) throw invalid_argument("除0错误"); return a / b; } void Func() { // 1、如果p1这里new 抛异常会如何? // 2、如果p2这里new 抛异常会如何? // 3、如果div调用这里又会抛异常会如何? int* p1 = new int; int* p2 =...
C++智能指针详解-阿里云开发者社区
一、智能指针概念 智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。 二、为什么需要智能指针 下面我们先分析一下下面这段程序有没有什么内存方面的问题? 关于内存泄漏见文章【C++ 内存管理】 三、智能指针设计原理剖析 RAII(Resource Acquisition Is Initialization),也称为 “资源获取就是初始化” ,是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。RAII是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。这种做法有两大好处: 不需要显式地释放资源。...
智能指针介绍(C++)_小羊byte的博客-CSDN博客
前言 关于智能指针大家或多或少都有听说过,因为在C++中没有GC,所以存在很多内存泄露的风险,所以基于RAII思想设计出了,智能指针,智能指针经过了很多个版本的迭代,从刚开始在C++98中推出了auto_ptr,但是auto_ptr不好用,它的设计存在重大缺陷,又因为C++的官方库更新的很慢,所以在接下来的n年中,没有改进,但是有一群大佬绝大C++库太简陋了,所以就自己搞了一个非官方的社区,写了一个库叫做boost,它里面重新写了智能指针。(boost库里面还有很多的其它东西),scoped_ptr/scoped防拷贝版本。shared_ptr/shared_ptr引用计数版本。weak_ptr-为了解决shared_ptr循环引用的问题。之后在C++11中官方引入了智能指针,参考boost的实现,稍微进行改进,其实C++11其它类似于右值引用移动语义等也是参考boost。unique_ptr:防拷贝版本,shared_ptr引用计数版本,weak_ptr解决shared_ptr循环引用的问题。 目录 详见内存泄露的危害 2.1RAII RAII(Resource...
C++进阶:异常和智能指针_AKA你的闺蜜的博客-CSDN博客
传统错误处理机制是assert断言和errno错误码。两种方式都有很大的局限性: 错误处理机制局限性 断言 强制终止程序,用户难以接受 错误码 返回值传递错误码,占用函数返回位置;无法直接展示信息,需查错误码表 1.
【C++习题集】-- 顺序表、链表
(用于复习) 目录 链表 oj题 常见的线性表:顺序表、链表、栈、队列、字符串...。 逻辑上: 线性结构 物理上: 不一定是连续 #include <iostream> #include <cassert> #include <malloc.h> #include <cstdlib> namespace qcr_vector { typedef int VectorType; struct Vector { VectorType* _array; // 指向动态开辟的数组 uint64_t _size; // 有效数据个数 uint64_t _capacity; // 容量空间的大小 }; /***************** * 顺序表初始化 *****************/ void VectorInit(Vector* vector) { assert(vector); vector->_array = nullptr; vector->_capacity = vector->_size = 0; } /***************** *...
C++初阶之内存分布_爱学习的鱼佬的博客-CSDN博客
我们先来看下面的一段代码 : int g_val=100; int g_unval; int main(int argc,char* argv[],char* env[]) { printf("code addr :%p\n",main); const char* p="hello"; printf("read only :%p\n",p); printf("global val :%p\n",&g_val); printf("global uninit val:%p\n",&g_unval); char* q1=(char*)malloc(10); char* q2=(char*)malloc(10); char* q3=(char*)malloc(10); char* q4=(char*)malloc(10); printf("heap addr :%p\n",q1); printf("heap addr :%p\n",q2); printf("heap addr :%p\n",q3); printf("heap addr :%p\n",q4); printf("stack...
day3_203移除链表元素_707设计链表_206反转链表_清影ssq的博客-CSDN博客
链表是一种通过指针串联起的线性结构,每个节点由两部分组成:一个数据域,一个指针域(存放指向下一节点的指针),最后一个节点的指针域指向null。 链表入口节点是头结点head。 双链表:两个指针域,指向下一节点和上一节点。(向前向后查询) 循环链表:首尾相连。 存储方式:通过指针,可以散乱的分布数据。 定义链表 手写链表: struct ListNode { int val; ListNode *next; ListNide() : val(0), next(NULL){}; ListNode(int x) : val(x), next(NULL){}; ListNide(int x, ListNode *next) : val(x), next(next){}; } struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL){}; }; 可以不定义构造函数,C++默认生成一个构造函数,但是 这个构造函数不会初始化任何成员变量。 通过自己定义构造函数初始化节点:...
C++中的内存空间管理详解【C++】_鄃鳕的博客-CSDN博客
int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof (int)* 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int)* 4); free(ptr1); free(ptr3); } 如图代码中变量在内存中的存储位置。 内存分布图: 1.栈又叫做堆栈,存储非静态局部变量/函数参数/返回值等等,栈是向下增长的。 栈是向下增长的,而堆是向上增长的? 一般来说,在栈上开辟空间,先开辟的空间地址较高,而在堆开辟空间,先开辟的空间地址较低。...
learn C++ NO.7--C/C++内存管理
现在是5月30日的正午,图书馆里空空的,也许是大家都在午休,也许是现在37摄氏度的气温。穿着球衣的我已经汗流浃背,今天热火战胜了凯尔特人,闯入决赛。以下克上的勇气也激励着我,在省内垫底的大学中,我不觉得气馁,我要更加努力学习,让自己能够越来越好,以后肯定也会”晋级决赛”。 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。 堆用于程序运行时动态内存分配,堆是可以上增长的。 数据段–存储全局数据和静态数据。 代码段–可执行的代码/只读常量 int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 =...
链表学习|L203.移除链表元素、L707.设计链表、L206.反转链表_liuhuisi23的博客-CSDN博客
链表相关知识: 单链表:通过指针串联在一起的线性结构,由两部分组成,一部分数据域,一部分指针域,通过结构体来对其进行创建,其包含一个数值,一个指针(指向下一个链表),还有一个构造函数 双链表:包含两个指针,一个指向前面一个指向后面 存储结构:链表的内存是不连续的,而是散乱分布,每次定义链表的时候都需要new一块内存 链表定义: Struct ListNode { int val; ListNode *next; ListNode(int x):val(x),next(NULL){} } 链表的基础操作:删除,增加 为了方便链表的操作,通常设置头结点,头结点的数值域为空(也可以存储线性表长度等附加信息) 但指针指向头链表的第一个节点 L203.移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/ #include<iostream> using namespace std; //定义链表 struct ListNode { int val; ListNode* next; //构造函数...
C++入门:初识类和对象_暴躁小程序猿的博客-CSDN博客
1.auto关键字(C++11) auto关键字是C++11中定义的,所以一些版本较低的编译器可能无法识别auto关键字,比如DevC++,我们来看一下这个关键字的用处。 1.1类型别名思考 我们作为后面接触的程序会越来越复杂,类型也会越来越多,这样也导致很容易就会出现错误,会出现以下问题: 1.类型难以拼写,容易拼写错误 2.含义不明确导致出错 我们先来看看下面的代码(有点超纲,里面的知识点没有讲到) #include <string> #include <map> int main() { std::map<std::string, std::string> m{ { "apple", "苹果" }, { "orange", "橙子" }, {"pear","梨"} }; std::map<std::string, std::string>::iterator it = m.begin(); while (it != m.end()) { } return 0; } std::map<std::string, std::string>::iterator...
C++ 链表_c++链表_浮生丶若尘的博客-CSDN博客
目录 虽然C++中有list容器,但是在某些oj题中会出现有关链表的题,所以写一篇C++链表。 省去太过官方的定义,只做最简单易懂的介绍。 一个数据所在的内存块被分为两个部分,第一个部分放数据,而第二个部分则放下一个数据的地址,以此来连接各个数据,最后一个内存块放的地址为NULL。这样的一个内存块叫做节点。 在代码中,链表的一个节点是这样的: struct ListNode { int data; ListNode* next;//结构体指针 }; 链表有一定的缺陷:每存放一个数据都需要伴随下一个数据的地址并且不支持随机访问。 先来看最简单的单链表。 1.实现基本的增删查改 #include<algorithm> #include<iostream> #include<vector> using namespace std; struct ListNode { int data; ListNode* next;//结构体指针 }; void Listprintf(ListNode* phead) { ListNode* cur=phead; while (cur != NULL)...
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with Struct
Contact Struct, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack