c++常见问题 1

  1. const关键字与宏定义的区别是什么?

    1.编译器处理方式不同,宏定义是在预处理阶段展开,做字符串替换,而const常量是在编译时。
    类型和安全检查不同。宏定义没有类型,不做任何类型检查,const常量有具体的类型,在编译时会执行类型检查const 关键字和宏定义的主要区别在于它们的作用域和类型检查机制。
    
    const 关键字是用来定义常量的,它可以应用于变量、函数参数和函数返回值等,在程序运行过程中不可修改。使用 const 声明的变量有其自己的内存地址,可以进行取地址操作,同时也会参与编译期的类型检查机制,避免了一些类型错误。
    
    而宏定义则是通过文本替换的方式将标识符替换为指定的代码片段,它的作用域仅限于定义时的当前文件范围内,无法取得地址且不会进行类型检查。在宏定义中,没有真正的变量和类型,只是单纯的文本替换,这样可能会造成一些难以发现的错误。
    
    因此,总的来说,const 更安全、更易于维护,而宏定义则更加灵活,但容易引入不必要的错误。
    
  2. malloc的底层实现是怎样的?free是怎么回收内存的?

    malloc 是 C 标准库中的一个函数,用于在堆上动态分配指定大小的内存。它的底层实现一般是通过系统调用(如 brk 或 mmap)来向操作系统申请一段内存,并返回其起始地址。具体实现方式可能因平台和编译器而异。
    
    当调用 malloc 时,它会首先检查当前程序的堆空间是否足够容纳所需大小的内存块。如果可以,则直接从当前堆空间的空闲区域中划分出一块内存并返回其地址。如果不够,则会向操作系统请求增加堆空间的大小,以满足分配请求。对于小块内存,通常会将多个请求合并成一个较大的块,以减少内存碎片的产生。
    
    free 是用于释放已分配内存的函数。当调用 free 时,它会将该块内存标记为已经可用,但不会立即归还给操作系统。相反,它会将这块内存与周围的空闲内存合并,形成更大的连续空闲块。这样可以减少内存碎片的产生,并提高下一次分配请求的成功率。当没有可用内存时,malloc 函数才会向操作系统请求增加堆空间。
    
  3. new/delete与malloc/free的区别与联系是什么?(面试常考)

    new/deletemalloc/free 都是用于在程序运行时动态分配和释放内存的函数,但它们之间有一些区别和联系。

    1. 区别:
    • 类型:new/delete 是 C++ 中的操作符,可以执行对象的构造和析构函数;而 malloc/free 是 C 语言中的函数,只能分配和释放内存块。
    • 大小参数:new 不需要指定申请的字节数,而是根据类型自动计算所需的大小,并返回对应类型的指针;malloc 需要指定申请的字节数,并返回 void 型指针。
    • 返回值:new 的返回值是一个指向已分配内存的指针,该指针指向的内存已经被初始化并准备好使用;malloc 返回的是一个指向未初始化内存的指针,需要用户手动进行初始化。
    • 异常处理:new 在分配内存失败时会抛出 std::bad_alloc 异常;而 malloc 则是返回空指针(NULL)。
    1. 联系:
    • 调用方式:new/deletemalloc/free 都是通过函数调用来执行内存分配和释放操作。
    • 内存管理:new/deletemalloc/free 都是堆上内存的分配和释放,可以灵活地管理内存池。但需要注意的是,在 C++ 中使用 new/delete 和在 C 中使用 malloc/free 时,不能混用,否则可能会出现内存泄漏或者数据损坏等问题。

    总之,虽然 new/deletemalloc/free 都可以进行内存分配和释放,但在实际应用中,需要根据具体情况选择合适的函数。如果是 C++ 代码,建议尽量使用 new/delete;如果是 C 代码,可以使用 malloc/free 或者一些其他内存分配方式。

  4. 区分以下概念:内存泄漏、内存溢出、内存踩踏、野指针?(面试常考)

    • 内存泄露memory leak是一种资源泄露,主要原因是计算机程序对存储配置管理的失当,造成失去对一段已分配内存空间的控制,造成程序持续占用已经不再使用的空间,或者是存贮器所存储的对象无法透过执行代码访问而令内存资源空耗 —————————— 一般一次内存泄漏不会有很大的影响,但内存泄漏堆积后后果就是内存溢出。
    • 内存溢出out of memory值得就是应用系统中无法回收的内存或者是使用的内存过多,最终使得程序运行要用的内存大于能够提供的最大内存,此时程序就运行不了了,系统会挺行内存溢出,简单的说就是想要的空间大于可以分配的弓箭大小

    以上两者的关系内存泄漏的堆积最终会导致内存溢出

    • 内存踩踏也称为内存重叠,踩内存
      1. 数组访问越界
      2. 字符串操作越界
        指访问了不合法的地址(访问了不属于自己的地址),如果访问的地址是其他变量的地址,就会破坏别人的数据,从而导致程序运行的异常

    野指针也称为悬空指针,值得是不指向任何合法的对象的指针
    指针的只想位置是不可知的(随机的,不正确的,没有明确限制的)指针变量在定义时没有进行初始化,其值是随机的,意味着指针指向了一个地址不确定的变量。简单说的野指针是指向一个已经删除的对象或未申请访问受限内存区域的指针

  5. 引用与指针的区别是什么?并且将"引用"作为函数参数有哪些特点?在什么时候需要使用"常引用"?

区别
引用必须被初始化,但是不分配存储空间,指针不声明时初始化,在初始时候需要分配存储空间
引用初始化后不能被改变,阵阵可以改变所指的对象
不存在指向空指的引用,但是存在都指向空指的指针

当引用作为函数参数时,其效果和用指针作为函数菜蔬的效果相当。当调用函数时,函数中的形参就会被当成参数变量或者对象的一个别名来使用,也就是说此时函数中对形参的各种操作实际上时对形参本身进行操作,而非简单的将实参变量或者对象的指拷贝给形参,
使用指针作为函数的形参虽然达到的效果和使用引用一样,但当调用函数时应需要将形参指针变量在内存中分配空间,而引用则不需要这样。


既要提高程序效率又要保护传递给函数的数据不再函数中被改变就需要使用常引用


  1. 什么是inline函数?inline与带参数的宏定义之间的区别是什么?

inline函数时内联函数,通常和类一起使用。用于取代c语言中的菜参数的宏定义

在C语言中使用宏可以提高执行效率,但宏本身并不是函数。1.使用宏最大的缺点就是容易出错,预处理器在拷贝在红代码时常常会产生意想不到的边际效应。2.另外宏另一个缺点就是不可调试,而内联函数可以调试。3.c++而言使用红代码还有一种缺点,无法操作类的私有数据成员。4.内联函数的的另一个优点是,,函数被内敛后编译器可以通过上下文相关的优化技术对结果代码执行更加深入的优化

下列输出是什么?

int main() 
{ 
    int a[5]={1,2,3,4,5}; 
    int *ptr=(int *)(&a+1); 
    printf("%d,%d",*(a+1),*(ptr-1)); 
}


输出是什么呢?

答案
2, 5

由于指针指向了数组下一个地址,所以-1指向了5
a+1指向了2

你可能感兴趣的:(c++,c++,开发语言)