首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 面试必备:常见 C++ 面试题汇总及详细解析

对于C++程序员来说,精通指针的使用是非常重要的。 重写和重载的区别 重写指的是派生类重新定义基类的虚函数行为。...重载则指的是同一个作用域内声明几个同名但是参数列表不同的函数。通过函数名相同但参数类型、个数或顺序的不同,可以让多个函数具有不同的行为。...如果基类的析构函数不是虚函数,则在这种情况下只会调用基类的析构函数,而不会调用派生类的析构函数,从而可能导致内存泄漏和未定义行为。...此外,extern关键字还可以用于多个文件中共享一个函数或类的定义。...避免和减少内存泄漏指针越界的错误,可以注意指针的长度、malloc时需要确定在哪里free、对指针赋值时注意被赋值指针需要不需要释放、动态分配内存指针最好不要再次赋值、C++优先考虑使用智能指针

1.8K30

C++面试题

内存泄漏的场景: malloc和free未成对出现;new/new []和delete/delete []未成对出现; 创建对象分配内存,但未显式释放内存;比如,通过局部分配的内存,未在调用者函数体内释放...,从而造成两次释放相同内存的做法;比如,类包含指针成员变量,未定义拷贝构造函数或未重载赋值运算符的情况下,编译器会调用默认的拷贝构造函数或赋值运算符,以逐个成员拷贝的方式来复制指针成员变量,使得两个对象包含指向同一内存空间的指针...,那么释放第一个对象时,析构函数释放该指针指向的内存空间,释放第二个对象时,析构函数就会释放同一内存空间,这样的行为是错误的; 没有将基类的析构函数定义为虚函数。...; 产生碎片不同: 对堆来说,频繁使用new/delete或者malloc/free造成内存空间的不连续,产生大量碎片,是程序效率降低; 对栈来说,不存在碎片问题,因为栈具有先进后出的特性; 生长方向不同...浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享一块内存;而深拷贝创造一个相同的对象,新对象与原对象不共享内存,修改新对象不会影响原对象。 10、字节对齐的原则是什么?

97930
您找到你想要的搜索结果了吗?
是的
没有找到

千万不要错过的后端【纯干货】面试知识点整理 I I

--- 父类指针指向子类对象的时候,释放内存的时候,若父类的析构函数不是virtual的话,子类的内存是不会得到释放的,因此内存泄漏 c++是如何处理内存泄漏的: 使用valgrind,mtrace...智能指针 使用智能指针,智能指针自动删除被分配的内存,他和普通指针类似,只是不需要手动释放指针,智能指针自己管理内存释放,不用担心内存泄漏问题 智能指针有: auto_ptr unique_ptr...产生段错误的原因 使用野指针 试图对字符串常量进行修改 new和malloc的区别: 申请内存时 new是一个操作符,可以被重载,malloc是一个库函数 new申请内存的时候,按照对象的数据结构分配内存...函数,realloc函数分配一块新内存的时候,会把原内存内存copy到新内存,通过memmove的方式 共享内存相关的api shmget 新建共享内存 shmat 连接共享内存到当前地址空间...宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义; 总结 分享了内存管理,内存泄露,智能指针 内存泄露检测工具 代码中产生段错误的原因 内存优化 其余小知识点 欢迎点赞,关注,

75830

【编程基础】C语言内存使用的常见问题

规则三:若存在多个弱符号,则从这些弱符号任选一个。 当不同文件内定义同名(即便类型和含义不同)的全局变量时,该变量共享同一块内存(地址相同)。...多线程环境下,所有线程栈共享同一虚拟地址空间。若应用程序创建过多线程,可能导致线程栈的累计大小超过可用的虚拟地址空间。...三、 堆区内存 1 内存未初始化 通过malloc库函数分配的动态内存,其初值未定义。若访问未初始化或未赋初值的内存,则会获得垃圾值。当基于这些垃圾值控制程序逻辑时,产生不可预测的行为。...一旦链接错误的库,则可能出现某个内存管理器中分配的内存另一个内存管理器释放的问题。...,如显示电脑游戏或动画视频画面时; Ÿ 程序能够请求未被释放的内存(如共享内存),甚至程序终止时; Ÿ 泄漏发生在操作系统内部或关键驱动; Ÿ 内存受限,如嵌入式系统或便携设备; Ÿ

3.2K60

C++智能指针

,出现内存泄漏导致响应越来越慢,最终卡死 C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏: 堆内存指的是程序执行依据须要分配通过malloc / calloc / realloc...假设程序的设计错误导致这部分内存没有被释放,那么以后这部分空间将无法再被使用,就会产生Heap Leak 系统资源泄漏: 指程序使用系统分配的资源,比方套接字、文件描述符、管道等没有使用对应的函数释放掉...上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针行为 指针可以解引用,也可以通过->去访问所指空间中的内容,因此模板类还得需要将***** 、**->**重载下,才可让其像指针一样去使用...+声明成私有;C++11防拷贝的方式修饰函数为delete 5、std::shared_ptr 概念及介绍: C++11开始提供更靠谱的并且支持拷贝的shared_ptr shared_ptr的原理...,引用计数同时++或–操作不是原子的,存在线程数据安全问题,导致资源未释放或者程序崩溃的问题,即内部计数操作需要加锁 智能指针管理的对象存放在堆上,两个线程同时去访问,导致线程安全问题,即调用指针对象去访问资源时需要自行保证访问的互斥

57120

C++11智能指针

内存泄漏的危害: 长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏导致响应越来越慢,最终卡死。...2.2 内存泄漏分类(了解) C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆内存指的是程序执行依据须要分配通过malloc / calloc / realloc...上边的SmartPtr还不能将其称为智能指针,因为它还不具有指针行为。...需要注意的是shared_ptr的线程安全分为两方面: 智能指针对象引用计数是多个智能指针对象共享的,两个线程智能指针的引用计数同时++或–,这个操作不是原子的,引用计数原来是1,++了两次,可能还是...导致资源未释放或者程序崩溃的问题。所以只能指针引用计数++、–是需要加锁的,也就是说引用计数的操作是线程安全的。 智能指针管理的对象存放在堆上,两个线程同时去访问,导致线程安全问题。

53520

“C++的90个坑”-阅读笔记

static变量将会在第一次调用时初始化 请使用virtual析构函数A* p = new B时,如果A的析构函数不是virtual的,delete p导致内存泄露等行为 不要让异常离开析构函数...,原因也是容易造成泄露 operator=或其他类似行为函数要注意自我赋值的情况,即 stData = stData 不同编译器,对函数调用的参数执行顺序是不同的,要注意这一点(如: func...(a(), b()),有些环境的执行顺序是a->b->func,有的是b->a->func shared_ptr和auto_ptr可以让动态链接库产生的对象产生的模块销毁,但是带来的问题是该智能指针无法升级...继承的非virtual函数重载之后会发生父类函数的覆盖,这时候可以手动using进来 纯虚析构函数必须有一个实现体,即便内容是空,否则会导致父类数据成员的内存泄漏 private继承和has-a...或protected了,然后通过另外的函数产生对象,但是这不能解决继承关系下的产生位置限定,所以我觉得非常应该避免 如上第26所述,缓式评估很NB,但是,实现的时候要注意写时复制的共享问题,要管理好可共享状态

1K10

C++类和对象以及成员函数

参考链接: 如何通过C++函数传递和返回对象? 一个实体拥有自己的属性和行为,属性是私有的,行为是共有的,C++实体对应的就是对象,实体抽象数据类型就是类,属性是成员变量,行为是成员函数。 ...空类的实例不包含任何信息,本来求sizeof应该是0,但是当我们声明该类型的实例的时候,它必须在内存占有一定的空间,否则无法使用这些实例。至于占多少内存,由编译器决定。VS是1。 ...成员函数我们可以将它们定义类里,也可以定义类外,一般建议定义类外,类里进行声明即可,这样会使代码看上去更美观,类里代码不会过多,看上去头重脚轻。...运行的话程序崩掉,因为good2,good3同时指向一块内存,调用析构函数时,good3先析构内存块就会被释放,good2就变成了野指针,析构时delete就会崩溃。  ...good3的指向变了之后指向了内存块1,析构时内存块1被释放,产生指针再析构时会崩溃,内存块2没有被释放产生内存泄漏

1.3K20

C++内存管理(建议收藏)

堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数按照一定的算法(具体的算法可以参考数据结构/操作系统)内存搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多...1.1.4 指针与数组的对比 C++/C程序指针和数组不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么静态存储区被创建(如全局数组),要么栈上被创建。...注意,即使是在这点,你的代码也可能更加”精力充沛”–你移出代码潜在的资源泄漏问题。 (3)下面是指向资源的裸指针。确保它们被独立的封装到auto_ptr,或者构造函数中分配在析构函数释放。...我们可以声明一个数组,考虑到有时候字符串极长,我们可以把数组大小设为200,但一般的情况下又不需要这么多的空间,这样是浪费了内存。...比如,类的构造函数中分配内存析构函数却没有释放该内存,但是因为这个类是一个Singleton,所以内存泄漏只会发生一次。

2.8K40

C# 内存管理机制及 WP 内存泄漏定位方法

当请求一块内存时,遍历空闲内存链表找到合适大小的内存块来满足请求。LOH的回收时机是SOH中二代GC的时候。 所以大对象的分配更慢,并且产生内存碎片。 5....析构函数(C#叫做Finalizer) GC过程,遇到有析构函数的对象,怎么处理?因为析构函数的复杂度是未知的,有可能非常耗时,所以GC的过程调用析构函数是不明智的。...引用类型通过new关键字创建,对象都是存储堆里的,值类型则不一样,值类型的对象函数声明时,即使是通过new关键字创建,也是栈中分配。...我认为大部分情况下都应该使用引用类型,因为共享同一个copy可以减少内存的占用,参数传递时只传递指针也要更高效,但下面几种情况我认为应该考虑使用值类型: a....其他被引用导致的泄漏,一般可以泄漏的类搜索this指针,看this指针是否有被添加到一些静态变量。 6. 小结 查找内存泄漏的步骤分为三部: a. 发现泄漏(存活对象计数) b.

4K80

深入探究C语言中的常量指针与野指针概念及其应用

未初始化的指针:定义指针变量时,如果没有进行初始化,那么该指针的值是随机的,可能指向任意的内存地址。这种情况下,如果尝试通过这个指针去读取或写入数据,可能导致程序崩溃或其他不可预期的行为。 2....为了避免野指针产生和影响,应当总是声明指针时对其进行初始化,并在释放指针指向的内存后立即将指针置为NULL,同时确保指针在其有效作用域内使用。...内存泄漏某些情况下,野指针可能导致内存泄漏。例如,如果一个野指针指向了一块已经分配但未被释放的内存,而这块内存又在其他地方被重复分配,就会造成内存泄漏。 4....总的来说,野指针是C/C++编程的一个常见问题,它们可能导致程序不稳定、数据损坏和内存泄漏等严重问题。因此,理解野指针的危害并采取适当的预防措施是非常重要的。...例如,函数参数传递一个指向常量的指针,这样函数内部就不能修改这个数据。 野指针:避免使用未初始化的指针和已经释放的内存地址的指针,以减少程序出错的风险。

11310

计算机考研复试C语言常见面试题「建议收藏」

11、智能指针 智能指针的作用是管理一个指针,因为普通指针申请的空间函数结束时常常忘记释放,从而造成内存泄漏。...智能指针的作用原理就是函数结束时自动释放内存空间,不需要手动释放内存空间。...它使用计数机制来表明资源被几个指针共享。当我们调用release()时,当前指针释放资源所有权,计数减一。当计数等于0时,资源会被释放。...当两个对象相互使用一个shared_ptr成员变量指向对方,造成循环引用,使引用计数失效,从而导致内存泄漏。...return 0; } 纯虚函数基类声明的虚函数,它在基类没有定义,但要求任何派生类都要定义自己的实现方法。

1.5K30

C++内存分区模型分析与实例以及扩展

程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域 代码区: 存放 CPU 执行的机器指令 代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可 代码区是只读的...; 2,建议设计类时将析构函数声明为虚函数(工程设计一个父类的析构函数为虚函数); 1,赋值兼容性申请子类对象给父类指针时,当 delete 作用在指针上时,编译器直接根据指针类型(此时是父类...编译器就不会简单的根据指针 p 的类型来简单调用父类的或者是子类的析构函数了,这个时候由于析构函数是虚函数,所以执行这行代码的时候,编译器根据指针 p 指向的实际对象来决定如何调用析构函数,这是多态...; return 0;}1,工程设计一个类作为父类出现时,我们都要将析构函数声明为虚函数,否 则就有可能产生内存泄漏,因为有可能跳过子类析构函数的调用,如果子类 析构函数中有释放资源的操作(动态内存空间...11,构造函数(构造函数调用虚函数)不可能发生多态行为: 1,构造函数执行时,虚函数指针未被正确初始化;12,析构函数(析构函数调用虚函数)不可能发生多态行为: 1,析构函数执行时,虚函数指针可能已经被摧毁

76041

【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

内存创建对象 : 如果在栈内存创建对象 , 方法结束后 , 自动释放 Student 对象 ; //栈内存创建对象 , 方法结束后 , 自动释放 Student 对象 void createInStack...//栈内存创建对象 , 方法结束后 , 自动释放 Student 对象 void createInStack() { Student student; } //堆内存创建对象 , 方法结束后...; // 直接声明对象 , 是内存创建实例 , 方法结束后 , 该实例自动释放 ; // 如果使用 new 创建对象 , 是内存创建 , 创建后返回一个对象的指针 ; //...堆内存的对象需要手动释放 , new 申请的对象 , 需要调用 delete 释放 ( delete 触发虚构函数 ) ; // 如果忘记手动释放使用 new 创建的对象 , 就会导致内存泄漏.../堆内存创建对象 , 将对象指针设置成智能指针 , 该对象方法结束时会自动释放 createInHeapWithSmartPointer(); //智能指针分类 : // 共享智能指针

31010

面试总结-C++

- 多态性:同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象接收时会产生不同的行为(重载实现编译时多态,虚函数实现运行时多态)。...Linux以.a结尾 动态库(共享库)的代码可执行程序运行时才载入内存,在编译过程仅简单的引用,因此代码体积比较小,程序运行时还需要动态库存在。...不同的应用程序如果调用相同的库,那么在内存只需要有一份该动态库(共享库)的实例。...异常安全 当异常抛出时,带有异常安全的函数: (1)不泄露任何资源 一般采用RAII技术,即以对象管(智能指针)理资源来防止资源泄漏。...4.流对象,资源对象,new对象,不应该直接作为参数,一旦抛出异常,就可能导致严重的问题,函数也许会被错误的执行,资源也许泄漏。 5.减少全局变量的使用。

2K11

百度不问我项目,全程基础拷打,真扎心!

这是因为使用delete操作符释放一个指向派生类对象的基类指针时,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用派生类的析构函数,这样就会导致内存泄漏和未定义行为的问题。...通过将析构函数定义为虚函数,可以确保释放派生类对象时,先调用派生类的析构函数,再调用基类的析构函数,从而避免内存泄漏和未定义行为的问题。...在哪些场景下应用智能指针 我自己是在在动态内存管理,使用智能指针可以避免手动管理内存的麻烦和出错风险。...使用智能指针等RAII机制,自动管理内存,避免手动管理内存的麻烦和出错风险。 使用内存分析工具,检测程序内存泄漏,并进行相应的修复。...多线程编程,如果多个线程同时访问同一个共享资源,可能会发生竞态条件(Race Condition),导致程序的行为出现未定义的情况。为了避免这种情况的发生,可以使用多线程锁来保护共享资源。

19910

【C++】智能指针

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏导致响应越来越慢,最终卡死。...内存泄漏的分类 C/C++程序中一般我们关心两种方面的内存泄漏: 堆内存泄漏(Heap leak) 堆内存指的是程序执行依据须要分配通过 malloc / calloc / realloc / new...需要下一条智能指针来管理才有保证。 采用 RAII 思想或者智能指针来管理资源。 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。 出问题了使用内存泄漏工具检测。...智能指针的原理 上述的 SmartPtr 还不能将其称为智能指针,因为它还不具有指针行为。...unique_ptr(const unique_ptr& up); private: T* _ptr; }; 但是只声明不实现也导致一些问题,比如我们可以类外进行实现

9110

你们要的C++面试题答案来了--基础篇

函数的定义和声明默认情况下都是extern的,但静态函数只是声明他的文件当中可见,不能被其他文件所用。...,如果你要在多个cpp复用该函数,就把它的声明提到头文件里去,否则cpp内部声明需加上static修饰; 类的静态成员 ,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则...为什么要使用智能指针: 智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间函数结束时忘记释放,造成内存泄漏。...所以许多简单的类没有用显式的析构函数。 如果一个类中有指针,且使用的过程动态的申请了内存,那么最好显示构造析构函数销毁类之前,释放掉申请的内存空间,避免内存泄漏。...举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类重写了的父类的虚函数的时候,会调用子类重写过后的函数父类声明为加了virtual关键字的函数子类重写时候不需要加

2.8K30

智能指针的讲解

如果说这只是一个小小的代码段,它的影响其实不大,但是如果是像操作系统这样的程序中发生内存泄漏那危害还是蛮大的 长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏导致响应越来越慢...delete[] p3; } 2.2 内存泄漏分类 C/C++程序中一般我们关心两种方面的内存泄漏: 1 堆内存泄漏(Heap leak) 堆内存指的是程序执行依据须要分配通过malloc / calloc...需要下一条智能指针来管理才有保证。 采用RAII思想或者智能指针来管理资源。 有些公司内部规范使用内部实现的私有内存管理库。这套库自带内存泄漏检测的功能选项。 出问题了使用内存泄漏工具检测。...重载operator*和opertaor->,具有像指针一样的行为。...,但是方式不同: 拷贝构造只声明不定义,但是怕有人在类外定义所以声明为私有 3.4 std::shared_ptr C++11开始提供更靠谱的并且支持拷贝的shared_ptr http://www.cplusplus.com

7710

内存泄漏-原因、避免以及定位

当我们程序对原始指针(raw pointer)使用new操作符或者free函数的时候,实际上是堆上为其分配内存,这个内存指的是RAM,而不是硬盘等永久存储。...,p的值为堆上的某块地址(在上述代码,p的值为0x1c66010),上述代码布局如下图所示: 产生方式 以产生的方式来分类,内存泄漏可以分为四类: 常发性内存泄漏 偶发性内存泄漏 一次性内存泄漏...隐式内存泄漏 常发性内存泄漏 产生内存泄漏的代码或者函数会被多次执行到,每次执行的时候,都会产生内存泄漏。...,如果派生类堆上申请了资源,那么就会产生内存泄漏。...开发过程遵守下面的规则,基本能90+%避免内存泄漏: 良好的编程习惯,只有有malloc/new,就得有free/delete 尽可能的使用智能指针,智能指针就是为了解决内存泄漏产生 使用log进行记录

1.1K20
领券