首页 > 其他分享 >每日计划-1031

每日计划-1031

时间:2024-10-31 22:46:14浏览次数:7  
标签:delete int 每日 nullptr 计划 内存 new 1031 指针

1. 完成 160. 相交链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 如果链表 A 的头节点为空或者链表 B 的头节点为空,直接返回 nullptr,表示没有交点
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }

        ListNode* a = headA;
        ListNode* b = headB;
        // 循环直到找到交点或者两个指针都为 nullptr
        while (a!= b) {
            // 如果指针 a 到达链表 A 的末尾,则将其指向链表 B 的头节点,继续遍历
            a = a == nullptr? headB : a->next;
            // 如果指针 b 到达链表 B 的末尾,则将其指向链表 A 的头节点,继续遍历
            b = b == nullptr? headA : b->next;
        }
        // 返回找到的交点,如果没有交点则返回 nullptr
        return a;
    }
};

2. 八股部分

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

一、new运算符的作用

  1. 动态内存分配

    • new用于在程序运行时从堆上分配内存空间。与在编译时确定内存大小的静态内存分配不同,动态内存分配允许根据程序的实际需求在运行时决定所需的内存大小。
    • 例如:int* ptr = new int; 这里为一个整数分配了内存空间,并将指向该内存的指针存储在ptr中。
    • 也可以为数组分配内存:int* arr = new int[10]; 为包含 10 个整数的数组分配内存。
  2. 调用构造函数

    • 对于类类型,new不仅分配内存,还会调用适当的构造函数来初始化对象。
    • 例如:MyClass* obj = new MyClass(parameters); 这里在分配内存后调用了MyClass的构造函数,并传入相应的参数来初始化新创建的对象。

二、delete运算符的作用

  1. 释放动态分配的内存

    • delete用于释放由new分配的内存空间,以防止内存泄漏。
    • 例如:delete ptr; 如果ptr是通过new int分配的指针,这条语句将释放该整数所占用的内存。
    • 对于数组:delete[] arr; 如果arr是通过new int[size]分配的数组指针,必须使用delete[]来释放整个数组的内存。
  2. 调用析构函数

    • 对于类类型,delete在释放内存之前会调用对象的析构函数,以执行必要的清理操作。
    • 例如:当释放一个指向类对象的指针时,delete obj; 会先调用obj所指向对象的析构函数,然后再释放内存。

2)什么是内存泄漏?如何避免内存泄漏?

什么是内存泄漏?

内存泄漏 memory leak ,是指程序申请内存后,无法释放已申请的内存空间,一次内存泄漏危害可以忽略,但内存堆积后果很严重,无论多少内存,迟早会被占光。

内存泄漏是指你向系统申请分配内存进行(new),可是使用完以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,(也行是你把它的地址弄丢了),而系统也不能再次将它分配给需要的程序。(了解一下然后查找解决内存泄漏 vs 提供了工具)

void fun(){ int *p=new int(3);//没有delete }

 如何避免内存泄漏?

  • 在函数申请一块内存,函数结束指针没有释放该堆区内存

  • 在父类指针或引用时,没有将父类的析构函数设置为虚析构

  • 指针需要重新赋值

  • 智能指针的循环引用问题(weal_ptr 解决循环引用可以给面试官画图讲解)

#include <iostream>  
#include <memory>  

class Child; // 前向声明  

class Parent {  
public:  
    std::shared_ptr<Child> childPtr; // Parent 拥有 Child 的共享指针  
    ~Parent() {  
        std::cout << "Parent destroyed" << std::endl;  
    }  
};  

class Child {  
public:  
    std::weak_ptr<Parent> parentPtr; // Child 拥有 Parent 的弱指针  
    ~Child() {  
        std::cout << "Child destroyed" << std::endl;  
    }  
};  

int main() {  
    {  
        // 创建 Parent 对象  
        auto parent = std::make_shared<Parent>();   
        
        // 创建 Child 对象  
        auto child = std::make_shared<Child>();  

        // 设置关系  
        parent->childPtr = child;        // Parent 持有 Child 的共享指针  
        child->parentPtr = parent;       // Child 持有 Parent 的弱指针  

        // 打印出 Parent 和 Child 的引用计数  
        std::cout << "Parent reference count: " << parent.use_count() << std::endl; // 输出 1  
        std::cout << "Child reference count: " << child.use_count() << std::endl;   // 输出 1  
    } // parent 和 child 都超出作用域,应该会正确释放  

    std::cout << "Exited the scope" << std::endl;  
    
    return 0;  
}

标签:delete,int,每日,nullptr,计划,内存,new,1031,指针
From: https://blog.csdn.net/asd_hero/article/details/143419349

相关文章

  • 每日python小白:如何打印九九乘法表?
    一、代码展示以防各位心急,咱先搬上来代码:代码一:初级版foriinrange(1,10):forjinrange(1,10):print("%d*%d=%d"%(i,j,i*j),end="")print()效果:代码二:完整版foriinrange(1,10):forjinrange(1,i+1):print("%d*%d=%d"......
  • GitHub每日最火火火项目(10.31)
    open-mmlab/Amphion:“open-mmlab/Amphion”是一个专注于音频、音乐和语音生成的工具包。其发音为/æm’fɑːrən/。这个项目旨在支持可重复的研究,并帮助初级研究人员和工程师在音频、音乐和语音生成的研究与开发领域迈出第一步。在当今数字化时代,音频技术在音乐制作、语......
  • SS241031C. 博弈(game)
    SS241031C.博弈(game)题意博弈的规则是,有\(3\)个数字\(x,y,z\),每次可以选择其中两个数字\(x,y\),改成\(x',y'\),满足和不变差严格变小,即\(x+y=x'+y',|x-y|>|x'-y'|\)。无法操作的失败。给你\(n\)个数字,问有多少种选\(3\)个数字的方案使得先手必胜。solution首先可以设......
  • 每日算法一练:剑指offer——数组篇(7)
    1.文物朝代确认        展览馆展出来自13个朝代的文物,每排展柜展出5个文物。某排文物的摆放情况记录于数组 places,其中 places[i] 表示处于第 i 位文物的所属朝代编号。其中,编号为0的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否能够视为连......
  • 项目管理计划都有什么作用
    项目管理计划是项目成功的关键导航工具,其主要作用包括确定目标与范围、资源分配、时间管理、风险识别与应对,以及质量保证。该计划帮助团队和利益相关者对项目有全面而明确的认识。特别值得一提的是,通过时间管理,项目管理计划确保了各个阶段和活动在预定时间内完成,从而避免延误和成......
  • 10.29每日一题
    别问我为什么这么现在才写10.29的题10.29每日一题很简单的一道动态规划题,没什么好解释的。但是鄙人此前未接触过动态规划,所以在看出来是动态规划题后想着有没有别的办法。很自然的想到能否从数学上找到通解。将题意抽象一下,要求大致为对于一个大小为n的数组,为没一个下标位置......
  • 20241031模拟赛题解
    T1题目描述给定一个圆形蛋糕,被\(n\)条切割线分成\(n\)个扇形蛋糕块,按照顺时针编号,第\(i\)块上有\(a_i\)个草莓,第\(i\)条切割线到第\(i+1\)条切割线之间的部分是第\(i\)块蛋糕。Alice和Bob流选择切割线,假设Alice选择了第\(i\)条切割线,Bob选择了第\(j\)条......
  • Leetcode每日一题 3216. 交换后字典序最小的字符串
    Leetcode每日一题##3216.交换后字典序最小的字符串###C++给你一个仅由数字组成的字符串s,在最多交换一次相邻且具有相同奇偶性的数字后,返回可以得到的字典序最小的字符串。如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5和9、2和4奇偶性相同,而......
  • 2024-10-31每日一题
    连续自然数和题目描述对一个给定的正整数\(M\),求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为\(M\)。例子:\(1998+1999+2000+2001+2002=10000\),所以从\(1998\)到\(2002\)的一个自然数段为\(M=10000\)的一个解。输入格式包含一个整......
  • 小学三年级学习计划
    为小学三年级的学生制定一个学习计划,可以帮助他们在学业上更有条理。以下是一个包含各学科的学习计划示例:学习计划概览周计划周一至周五:主课学习周六:复习与实践周日:休息与兴趣发展学科安排语文周一、周三:每天阅读课文,理解课文内容。词语积累:每天学习5-10个......