C++循环引用

每日一题

. - 力扣(LeetCode)

class Solution {
public:
    ListNode* trainingPlan(ListNode* head, int cnt) {
        int leng = 0;
        ListNode* p = head;
        while(p){
            leng++;
            p = p->next;
        }
        for(int i = 0;i < leng - cnt;i++){
            head = head -> next;
        }
        return head;
    }
};

八股

new或malloc在申请空间时,超出可申请的大小就会分配异常,可申请的大小是多少

在 C++ 中,new 和 C 语言中的 malloc 都用于动态内存分配。它们会尝试从操作系统请求一块内存空间。如果超出操作系统允许的最大内存空间,分配操作会失败,返回 nullptr(对于 newnullptr,对于 mallocNULL)。

在 32 位系统中,进程最大可访问的内存通常为 2 GB 或 4 GB(具体取决于操作系统和硬件),而在 64 位系统中,理论上可以申请几 TB 的内存(实际上,操作系统和硬件也有自己的限制)。

C++循环引用指的是什么,在使用过程当中需要注意什么问题

循环引用通常指的是两者(或更多对象)之间通过指针或引用的方式互相引用,从而形成一个闭环或环形依赖。这种依赖关系常见于对象之间通过指针(或智能指针)互相引用的场景。

循环引用可能导致的问题:

  1. 内存泄漏: 循环引用最常见的问题是内存泄漏。假设你使用 new 来动态分配 AB 对象,并且 AB 互相引用对方。即使你明确调用了 delete 释放内存,两个对象仍然持有彼此的指针,导致它们的引用计数永远不会归零,从而无法释放内存。

  2. 智能指针引起的内存泄漏: 使用 std::shared_ptr 时,如果两个对象互相持有 shared_ptr,它们的引用计数不会降为零,导致内存无法释放。

如何避免和解决循环引用:

  1. 使用 std::weak_ptr std::weak_ptr 是一种智能指针,它不会增加引用计数,因此可以用来打破循环引用。通常,如果两个对象互相引用,而你希望避免循环引用,可以让其中一个对象持有 std::weak_ptr 而不是 std::shared_ptr

  2. 避免过度依赖互相引用: 尽量避免让两个对象互相依赖,尤其是在设计阶段。设计时可以考虑使用其他设计模式(例如观察者模式、委托模式等),从而减少直接的相互引用。

  3. 手动管理内存: 如果没有使用智能指针,可以使用原始指针时小心内存管理,确保在销毁对象时手动处理引用关系,避免出现指针引用死锁或者循环引用的问题。这通常需要实现自己的内存管理逻辑,或者确保在删除对象时避免发生引用丢失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值