• c++之new和delete


    前言

            在本文中,您将学习使用new和delete操作在C ++中有效地管理内存。

    数组可用于存储多个同类型数据,但是使用数组存在严重的缺点。声明数组时应分配内存,但在大多数情况下,直到运行时才能确定所需的确切内存。在这种情况下,最好的做法是声明一个具有最大可能所需内存的数组(声明一个预期具有最大可能大小的数组)。不利的一面是未使用的内存被浪费了,不能被任何其他程序使用。为避免浪费内存,您可以在C ++中使用new和delete运算符动态分配运行时所需的内存。

    示例1:C ++内存管理

    c++程序存储n个学生的成绩,并将其显示,其中n为用户输入的学生人数

    1. #include
    2. int main() {
    3. int num;
    4. std::cout << "输入学生总数:";
    5. std::cin >> num;
    6. float* ptr;
    7. // 内存分配的浮点数
    8. ptr = new float[num];
    9. std::cout << "输入学生成绩:" << std::endl;
    10. for (int i = 0; i < num; i++) {
    11. std::cout << "学生" << i + 1 << ":";
    12. std::cin >> *(ptr + i);
    13. }
    14. std::cout << "显示学生的成绩:" << std::endl;
    15. for (int i = 0; i < num; i++) {
    16. std::cout << "学生" << i + 1 << ":" << *(ptr + i) << std::endl;
    17. }
    18. // ptr 内存释放
    19. delete[]ptr;
    20. return 0;
    21. }

    输出结果: 

    在这个程序中,只动态声明存储num(由用户输入)浮点数所需的内存。

    new 运算符

    ptr = new float[num];

    上面程序中的表达式返回一个指向内存部分的指针,该内存恰好足以容纳num个浮点数据。

    delete 运算符

            使用new运算符分配内存后,应将其释放回操作系统。如果程序使用new占用大量内存,则系统可能会崩溃,因为操作系统没有可用的内存,导致内存耗尽。以下表达式将内存释放返回给操作系统。

    delete [] ptr;

    方括号[]表示数组已被删除。如果需要删除单个对象,则不需要使用方括号。如:

    delete ptr;

    示例2:C ++内存管理

    C ++中用面向对象的方法来处理的上述程序。

    1. #include
    2. class Test {
    3. private:
    4. int num; // 学生个数
    5. float* ptr;
    6. public:
    7. Test() { // 构造函数
    8. std::cout << "输入学生总数:";
    9. std::cin >> num;
    10. ptr = new float[num];
    11. std::cout << "输入学生成绩:" << std::endl;
    12. for (int i = 0; i < num; i++) {
    13. std::cout << "学生" << i + 1 << ":";
    14. std::cin >> *(ptr + i);
    15. }
    16. }
    17. ~Test() {
    18. delete[]ptr;
    19. }
    20. void display() {
    21. std::cout << "显示学生成绩:" << std::endl;
    22. for (int i = 0; i < num; i++) {
    23. std::cout << "学生" << i + 1 << ":" << *(ptr + i) << std::endl;
    24. }
    25. }
    26. };
    27. int main() {
    28. Test s;
    29. s.display();
    30. return 0;
    31. }

    该程序的输出与上述程序输出结果相同。创建对象s时,将调用构造函数,该构造函数为num个浮点数据分配内存。当对象被销毁时,即,对象超出范围时,将自动调用析构函数。

        ~Test() {
            delete[] ptr;
        }

    这个析构函数执行delete[] ptr;并将内存返回给操作系统。

  • 相关阅读:
    Codeforces Round #809 (Div. 2)(A~D2)
    fiddler抓包番外————了解工具栏
    Prometheus + grafana 的监控平台部署
    【SpringCloud】03 nacos集群模式
    java-php-python-贝壳找房系统计算机毕业设计
    【国科方案】设置引脚复用、方向和输入输出
    Go语言错误处理最佳实践
    洛谷 P8420 [THUPC2022 决赛] 匹配 题解--zhengjun
    重学Spring总结
    Postman连接MySQL数据库并操作
  • 原文地址:https://blog.csdn.net/m0_48241022/article/details/133867888