31. 为什么会产生内存泄露?如何预防内存泄露?

内存泄露是指程序在动态分配内存后,没有释放该内存,导致系统无法再次使用该内存空间。常见的内存泄露原因包括:忘记释放动态分配的内存、使用错误的内存释放函数、循环引用等。

预防内存泄露可以通过以下方法:

  • 在动态分配内存后,及时释放内存。
  • 使用智能指针来管理动态内存,自动释放内存。
  • 注意循环引用的情况,避免出现无法释放的内存。
  • 避免频繁分配和释放内存,可以使用对象池等技术来优化内存使用。

32. 在没有继承的情况下,如何让对象 B,间接访问对象 A 的私有成员?

如果对象 B 需要间接访问对象 A 的私有成员,可以在对象 A 中定义一个公有的成员函数,通过该函数来访问私有成员,并将对象 B 作为参数传入该函数,使得对象 B 可以通过该函数间接访问对象 A 的私有成员。

33. C 语言程序内存分布有哪些?

C 语言程序的内存分布包括以下几个部分:

  • 代码区:存放程序的执行代码。
  • 全局区:存放全局变量和静态变量。
  • 堆区:动态分配的内存空间,需要手动管理内存的分配和释放。
  • 栈区:存放局部变量和函数调用的上下文信息。

34. 虚析构函数有什么作用?

虚析构函数是为了解决通过基类指针或引用来删除派生类对象时可能造成的内存泄露问题。当基类指针或引用指向一个派生类对象时,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用派生类的析构函数,可能导致派生类对象中的资源没有得到释放。通过将基类的析构函数声明为虚函数,可以实现在通过基类指针或引用删除派生类对象时,同时调用派生类的析构函数,确保派生类对象中的资源得到释放。

35. 进程和线程的区别?

进程是操作系统资源分配的基本单位,是程序在执行过程中分配和管理资源的独立单位。进程有自己独立的地址空间,可以拥有多个线程,并且拥有独立的堆、栈和数据段。而线程是进程的执行单元,是进程中的一个实体,是 CPU 调度和分派的基本单位。线程共享进程的地址空间,可以访问相同的全局变量和静态变量。

36. 变量的声明和定义有什么区别?

变量的声明是指在使用变量之前,向编译器说明变量的类型和名称,不会分配内存空间。变量的定义是指为变量分配内存空间,并可以同时进行初始化。

37. 简述程序编译的内存分配?

程序编译的内存分配包括以下几个阶段:

  • 静态存储区:存放全局变量、静态变量和常量。
  • 栈区:存放局部变量和函数调用的上下文信息。
  • 堆区:动态分配的内存空间,需要手动管理内存的分配和释放。

38. 简述 strcpy,sprintf 和 memcpy 函数的区别?

strcpy 函数用于将一个字符串复制到另一个字符串中;sprintf 函数用于将格式化的数据写入一个字符串中;memcpy 函数用于将一段内存的内容复制到另一段内存中。它们的区别在于:

  • strcpy 和 sprintf 是针对字符串进行操作的,而 memcpy 可以用于任意类型的内存拷贝。
  • strcpy 和 sprintf 会自动在目标字符串的末尾加上 '\0' 作为结束符,而 memcpy 不会添加结束符。
  • strcpy 和 sprintf 会自动处理字符串的长度,而 memcpy 需要显式指定拷贝的长度。

39. 分别简述内存溢出和内存泄漏?

内存溢出是指程序在申请内存时,超出了可用的内存空间大小,导致程序崩溃或异常。内存泄漏是指程序在动态分配内存后,没有释放该内存,导致系统无法再次使用该内存空间。区别在于,内存溢出是指申请内存空间过大,而内存泄漏是指未释放已经申请的内存空间。

40. 分别简述 C 和 C++ 中 class 和 struct 的区别?

在 C 语言中,struct 是一种自定义的数据类型,用于封装多个不同类型的成员变量。在 C++ 中,class 是一种自定义的数据类型,也用于封装多个不同类型的成员变量,同时还可以包含成员函数和访问修饰符。区别在于,struct 默认的成员访问修饰符是 public,而 class 默认的成员访问修饰符是 private。

41. 简述类方法和实例方法?

类方法是指定义在类中的静态成员函数,可以通过类名直接调用,不需要实例化对象。实例方法是指定义在类中的非静态成员函数,需要通过实例化对象来调用。

42. 重载,重写,重定义的区别?

重载是指在同一个作用域内,根据函数的参数类型和个数的不同,可以定义多个具有相同名称但参数不同的函数。重写是指派生类重新实现了基类中的虚函数,具有相同的函数名称和参数列表。重定义是指在派生类中重新定义了与基类中同名的非虚函数,但函数参数和返回值可以不同。

43. 引用与指针有什么区别?

引用和指针都可以用来间接访问一个对象,但有以下区别:

  • 引用必须在定义时初始化,并且不能重新指向其他对象,而指针可以在任何时候指向其他对象。
  • 引用不能为空,而指针可以为空。
  • 引用在内存中没有单独的存储空间,而指针在内存中有自己的存储空间。

44. C++ 是不是类型安全的?

C++ 在类型安全性方面相比 C 语言更强,但并不是完全类型安全的。C++ 中可以通过强制类型转换等手段绕过类型系统,进行一些不安全的操作。此外,C++ 还存在一些与指针相关的问题,如空指针访问、野指针等,也可能导致类型不安全。

45. 多态类中的虚函数表是 Compile-Time,还是 Run-Time 时建立的?

虚函数表是在编译时建立的,是存储在类的元数据中的。虚函数表记录了类中所有虚函数的地址。在运行时,通过对象的虚函数表来实现多态性,根据对象的实际类型来调用相应的虚函数。

C++ 面试常见问题解答:内存管理、面向对象、多态等

原文地址: https://www.cveoy.top/t/topic/jAbO 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录