【每日C/C++问题】

一、解释一下 new 和 delete 运算符在 C++ 中的作用。

new delete 是两个用于动态内存分配和释放的运算符。

new用于在堆上动态分配内存, 并调用构造函数初始化对象。

1、new 运算符用于在堆上(heap)分配内存。基本语法如下:

cpp 复制代码
Type* pointer = new Type;

其中,Type 是任何有效的数据类型,如 int、float、char 等,也可以是类或结构体。此语句会在堆上为指定类型的变量分配足够的内存,并返回指向该内存的指针。如果内存分配成功,这个指针可以用于访问新分配的内存。如果内存分配失败(例如,因为堆空间不足),则 new 会抛出 std::bad_alloc 异常。

2、也可以使用 new 运算符创建动态数组

cpp 复制代码
int* arr = new int[10];  // 在堆上创建一个包含 10 个 int 的数组

delete 用于释放由 new 分配的内存,并调用析构函数清理对象。

1、delete 运算符用于释放由 new 分配的内存。基本语法如下:

cpp 复制代码
delete p;  // 释放 p 指向的内存

其中,p 是指向由 new 分配的内存的指针。delete 运算符会释放 p 指向的内存,并使 p 变为悬挂指针。

2、如果你使用 new[] 创建了一个动态数组,你应该使用 delete[] 来释放这个数组:

cpp 复制代码
delete[] arr;  // 释放动态数组

值得注意的是,如果你使用 new 在堆上分配了内存,你必须记住使用 delete 来释放这个内存。否则,你的程序可能会出现内存泄漏。

二、什么是内存泄漏?如何避免内存泄漏?

**概念:**内存泄漏是指程序中动态申请的内存(new)没有被正确释放(delete),这块内存程序不能再访问,而系统也不能再次将它分配给其他程序,导致内存资源的浪费。

**如何避免:**避免内存泄漏的方法包括及时释放不再使用的动态内存、使用智能指针等。

三、【力扣】160. 相交链表

题目:

cpp 复制代码
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单
链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

**思路1:**将链表 A 的节点都放入集合中,再遍历集合 B ,查找集合中是否有与链表 B 相同的节点,如果查找到相同的节点即为相交节点,没查找到证明 A 与 B 不相交返回 nullptr 。

代码:

cpp 复制代码
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        unordered_set<ListNode*> s;
        ListNode* A = headA;
        while (A) { // 将链表A的节点都存入集合中
            s.insert(A);
            A = A->next;
        }
        ListNode* B = headB;
        while (B) { 
        // 遍历链表B如果在集合中找到第一个与链表B相同的节点即为相交节点,没找到则返回false
            if (s.find(B) != s.end()) {
                return B;
            }
            B = B->next;
        }
        return nullptr;
    }
};
cpp 复制代码
时间复杂度:O(m + n)

空间复杂度:O(m)

其中 m 为链表 A 的长度 ,n 为链表 B 的长度。

**思路2:**让 A 和 B 遍历完自己的链表,再继续遍历对方的链表,如果有相交节点那么一定存在 A == B 且 A 不为 null,如果不存在相交节点在遍历完对方链表时一定存在 A == B,且 A 和 B为null

An,Bn 代表 A, B遍历第 n 次的位置

有相交节点的情况:(存在A == B, 且不为null)

无相交节点情况:(A == B, 且都为null)

代码:

cpp 复制代码
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *A = headA, *B = headB;
        while (A != B) {
            A = A == nullptr ? headB : A->next;
            B = B == nullptr ? headA : B->next;
        }
        return A;
    }
};
cpp 复制代码
时间复杂度:O(m + n)

空间复杂度:O(1)

其中 m 为链表 A 的长度 ,n 为链表 B 的长度。
相关推荐
青少儿编程课堂5 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
2501_941875289 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj9 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp11 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob23312 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒12 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb13 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
Keven_1113 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
mengzhi啊14 小时前
QPluginLoader 动态 DLL 插件版,支持插件之间通信,广播。请求和应答
c++·qt
脉动数据行情114 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#