51. 什么是红黑树?为什么要有红黑树?

红黑树是一种自平衡二叉搜索树,它在插入和删除操作后通过重新着色和旋转保持平衡。红黑树的每个节点都包含一个额外的颜色属性,可以是红色或黑色。红黑树的性质确保了树的高度保持在 O(log n) 级别,从而使基本操作(插入、删除和查找)的时间复杂度维持在O(log n)。

在这里插入图片描述
在这里插入图片描述
这些性质确保了红黑树是接近平衡的,从而保证了其操作的高效性。
NIL节点(或者称为哨兵节点)是一个特殊的节点,用于表示树的终端(叶子)节点的子节点或树的空节点

在这里插入图片描述
以下是二叉搜索树(BST)、AVL树和红黑树的对比总结表格:

在这里插入图片描述
在这里插入图片描述

52. 内存泄漏的原因有哪些?

C++ 内存泄漏通常是由于程序在动态分配内存后没有正确释放内存导致的

以下是一些常见原因:

1. 忘记释放内存

这是最常见的原因。程序员在使用 new 或 malloc 分配内存后,忘记使用 delete 或 free 释放内存

void memoryLeak() {
    int* ptr = new int[10];
    // 忘记使用 delete[] ptr;
}

2. 多重返回路径

函数中有多个返回路径,而不是在所有路径上都确保释放内存。

int* functionWithMultipleReturnPaths(bool condition) {
    int* ptr = new int[10];
    if (condition) {
        return ptr;  // 在这里返回时没有释放内存
    }
    delete[] ptr;
    return nullptr;
}

3. 异常处理不当

在使用 try 和 catch 进行异常处理时,没有正确释放内存。

void exceptionHandling() {
    int* ptr = new int[10];
    try {
        // 可能抛出异常的代码
    } catch (...) {
        // 捕获异常,但没有释放 ptr
    }
    delete[] ptr;
}

4. 忘记释放容器中的对象

使用容器存储动态分配的对象时,忘记在容器销毁前释放这些对象。

void containerLeak() {
    std::vector<int*> vec; 
    vec.push_back(new int(1));
    vec.push_back(new int(2));
    // 忘记释放 vec 中的内存
    
     // 释放 vec 中的内存
     /*for (int* ptr : vec) {         
         delete ptr;     
     }    
     vec.clear();*/
}


5. 循环引用

在使用智能指针(如 std::shared_ptr)时,可能会出现循环引用,导致内存无法释放。

struct Node {
    std::shared_ptr<Node> next;
};

void circularReference() {
    auto node1 = std::make_shared<Node>();
    auto node2 = std::make_shared<Node>();
    node1->next = node2;
    node2->next = node1;  // 形成循环引用
}

6. 资源管理不当

对文件句柄、网络连接等资源的管理不当,也会导致内存泄漏。

这句话的意思是,如果不正确管理文件句柄、网络连接等系统资源,可能会导致资源泄漏,尽管严格来说,这些问题并不属于内存泄漏,但它们也会引发类似的资源耗尽问题。

void resourceLeak() {
    FILE* file = fopen("example.txt", "r");
    // 忘记使用 fclose(file);
    
     //if (file.is_open()) {             file.close();         }
}

在这里插入图片描述

53. HTTP1.1和HTTP2.0的区别?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

54. HTTP3.0有了解过吗?

HTTP/3 基于 QUIC 协议,QUIC 是一个传输层协议,旨在提高 HTTP 的性能和安全性。QUIC 最初由 Google 开发,现已成为 IETF 标准。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

55. 网站的负载均衡是怎么做的?ngnix反向代理原理?

网站的负载均衡是通过将用户的请求分配到多个服务器来实现的,**以提高网站的性能和可靠性。**常用的负载均衡方法包括硬件负载均衡和软件负载均衡,Nginx 是一种广泛使用的软件负载均衡器和反向代理服务器。

在这里插入图片描述
在这里插入图片描述

Nginx 负载均衡配置示例

以下是一个使用 Nginx 进行负载均衡的配置示例:

http {
    upstream backend {
        # 定义后端服务器组
        server backend1.example.com weight=3;
        server backend2.example.com;
        server backend3.example.com;

        # 使用加权轮询策略
        # 其他可用策略:least_conn, ip_hash, 等
    }

    server {
        listen 80;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

在这里插入图片描述
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐