7、基础 | C++的内存管理二

1. new 和 delete

在C++中,内存管理是一个核心且复杂的主题,它涉及到动态内存分配和释放。newdelete操作符是C++中用于管理动态内存的主要工具。

1.1 new

new操作符用于在堆上动态分配内存,并调用对象的构造函数(如果有的话)。new可以返回指向分配的内存的指针,该指针可以用来访问和操作对象。

例子
#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass(int x) : value(x) {}
    void display() const {
        cout << "Value: " << value << endl;
    }
private:
    int value;
};

int main() {
    // 使用new动态分配MyClass对象
    MyClass* myObject = new MyClass(10);

    // 使用对象
    myObject->display();  // 输出: Value: 10

    // ...(后续对myObject的操作)

    // 不要忘记释放内存
    delete myObject;

    return 0;
}

在这个例子中,new操作符被用来在堆上分配一个MyClass类型的对象,并调用其构造函数,传递参数10。分配的内存地址被存储在指针myObject中,然后通过该指针访问对象的display方法。

1.2 delete

delete操作符用于释放之前通过new操作符分配的内存。当使用delete时,对象的析构函数(如果有的话)会被调用,以执行必要的清理工作。

例子(继续上面的代码)
// ...(前面的代码)

// 释放内存
delete myObject;

// 注意:释放内存后,myObject成为悬垂指针(dangling pointer),
// 它不再指向有效的内存地址。为了安全起见,可以将它设置为nullptr。
myObject = nullptr;

// 尝试访问已删除的对象会导致未定义行为
// myObject->display();  // 不要这样做!

return 0;

在这个例子中,delete操作符被用来释放myObject指针所指向的内存。在释放内存后,将myObject设置为nullptr是一个好习惯,这可以防止悬垂指针的问题。

注意事项

  • 匹配new和delete:对于每个new表达式,都应该有一个对应的delete表达式。同样,对于new[](用于分配对象数组),应该使用delete[]来释放内存。
  • 避免内存泄漏:确保所有通过new分配的内存最终都被delete释放。内存泄漏是程序长期运行后性能下降的常见原因之一。
  • 避免重复释放:不要对同一个指针使用多次delete。这会导致未定义行为,通常表现为程序崩溃。
  • 智能指针:C++11及更高版本引入了智能指针(如std::unique_ptrstd::shared_ptr),它们可以自动管理内存,减少内存泄漏的风险。

通过合理使用newdelete(或智能指针),C++程序员可以精确控制程序的内存使用,编写出高效、可维护的代码。

2. 智能指针

在C++中,智能指针是管理动态内存的一种重要方式,它们能够自动释放所管理的资源,从而避免内存泄漏等问题。以下是关于智能指针的详细整理,包括通用操作、shared_ptr、unique_ptr和weak_ptr,并附有具体例子。

2.1 智能指针的通用操作

智能指针的行为类似于常规指针,但它们提供了自动资源管理的功能。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C/C++面试必考必会 文章被收录于专栏

【C/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务