C++ 学习 11(10.11-10.12)

130 阅读4分钟

1.1 关键字

在C++中,new关键字用于动态地分配内存空间,并返回所分配内存的地址。通过使用new关键字,可以在运行时创建对象、数组和其他数据结构。

new的常见用法:

  1.  单个对象的动态分配:使用new关键字来分配单个对象的内存空间,并返回指向该对象的指针。例如:int* p = new int; 将分配一个整型变量的内存,并将其地址赋值给指针 p。   
  2. 数组的动态分配:通过new关键字,可以动态地分配数组的内存空间。例如:int* arr = new int[5]; 将分配一个包含5个整型元素的数组,并将其首地址赋值给指针 arr
  3.   对象的动态分配:使用new关键字可以动态地创建对象,并返回指向该对象的指针。例如:MyClass* obj = new MyClass(); 将创建一个 MyClass 类的对象,并将其地址赋值给指针 obj。
  4.  内存分配失败处理:在动态内存分配过程中,如果内存不足或分配失败,new关键字将抛出 std::bad_alloc 异常。可以使用异常处理机制来捕获并处理这个异常情况。
  5.  忘记释放内存会导致内存泄漏:使用new关键字分配的内存空间需要手动释放,否则会导致内存泄漏。使用 delete 关键字来释放通过 new 分配的单个对象,或使用 delete[] 关键字来释放通过 new[] 分配的数组。

注意:

为了避免内存泄漏和悬挂指针等问题,应该在不再需要动态分配的内存时及时释放它们。

内存泄漏和悬挂指针是两个与动态内存管理相关的常见问题。
1 内存泄漏: 内存泄漏指的是在动态内存分配后,程序没有释放或无法访问已分配的内存空间的情况。这种情况下,每次分配内存后都没有相应的释放操作,导致程序持续占用内存,最终可能导致系统资源耗尽
内存泄漏的常见原因:

  1.  忘记使用 delete 或 delete[] 来释放通过 new 或 new[] 分配的内存。
  2. 在对象之间交叉引用时,没有正确地释放相关的内存。
  3. 异常发生时没有释放已分配的内存。

 避免内存泄漏的方法是,在动态内存分配后,确保及时释放分配的内存。在合适的时机使用 delete 或 delete[] 将内存归还给系统

2 悬挂指针: 悬挂指针指的是指向已经释放的或无效的内存地址的指针当程序中的指针继续引用已经释放的内存区域时,可能会导致未定义的行为。 悬挂指针的常见原因:

  1.  使用已经被释放的内存地址。
  2.  在指针释放后,没有将其设置为 nullptr 或其他合法的值。

 避免悬挂指针的方法是,在释放内存后将指针设置为 nullptr,以确保不会再被误用。此外,使用智能指针、遵循良好的程序设计原则和规范,也可以减少悬挂指针的出现。

空指针

空指针是指不指向任何有效对象或函数的指针。在C++中,空指针用特殊的值 nullptr 表示。
1:初始化空指针: 可以通过将指针初始化为 nullptr 或赋值为 nullptr 来将其设置为空指针。int* ptr = nullptr;

2 :查空指针: 在使用指针之前,最好始终检查它是否为空指针,以避免解引用空指针导致的未定义行为。

if (ptr == nullptr) {
    // 处理空指针的情况
}

3:避免悬挂指针: 在释放指针所指向的内存后,最好将指针设置为 nullptr,以避免悬挂指针的情况。

delete ptr;
ptr = nullptr;

4:空指针的类型: 空指针本身没有类型,可以将其赋值给任何指针类型的指针变量。

int* ptr = nullptr;  // 空指针
char* charPtr = nullptr;  // 不同类型的空指针

5:解引用空指针: 解引用空指针是一种未定义行为,可能导致崩溃或其他不可预测的结果。因此,在解引用指针之前,应确保它指向有效的对象或函数。