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

C++ 万字长文第一篇---拿下字节面试

构造函数函数 构造函数每次创建对象的时候调用函数名称和类名相同,无返回类型,构造函数可以为类初始化某些成员。...函数每次删除对象的时候调用函数名称和类名相同,但在前面加了一个 符号,同样无返回类型。若对象调用过程中用 动态分配了内存,可以函数中写 语句统一释放内存。...如果用户没有写函数,编译系统自动生成默认函数。...image.png 是标准函数库 是 ++ 运算符 从堆分配内存 从自由存储区分配内存 需要显式指出分配内存大小 编译器自行计算 不会调用构造/函数调用构造/函数 返回无类型指针 ()...使用智能指针可以很大程度的避免这个问题,因为智能指针是一个类,超出类的作用范围后,类会调用函数释放资源,所以智能指针的作用原理就是函数结束后自动释放内存空间。

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

cc++问题集三

emplace_back():插入元素的时候直接构造(原地构造),只调用一次构造函数,不需要触发拷贝构造和转移构造。而且调用形式更加简洁,直接根据参数初始化临时对象的成员。...智能指针可以自动释放new分配的内存,不需要手动delete这些new分配的内存 智能指针的实质是一个对象,行为却表现的像一个指针 auto_ptr:c++98版本,c++11中已不再使用,管理权转移的思想...后B才,对于B,A必定是B后才A,这就是循环引用的问题,违反常规,导致内存泄露。...调用push_back当空间不够装下数据时会自动申请另一片更大的空间(一般是原来的两倍),然后把原有数据拷贝过去,之后拷贝push_back的元素,最后要原有的vector并释放原有的内存空间 当调用...红黑树可以O(log n)时间内做查找,插入和删除 基本操作:左旋,右旋,重新着色 目的:红黑树插入(新插入节点都为红节点),删除过程中可能破坏原本的平衡条件导致不满足红黑树的性质,这时候一般情况下要通过左旋

84430

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...在对象的构造函数中执行资源的获取(指针的初始化),函数中释放(delete 指针)。...中现在裸指针的所有权已经归智能指针所有,由智能指针来管理Node 对象的生存期,故函数中不再需要delete 指针; 的操作。...;如果 std::vector::push_back(val); 失败(operator new 失败),抛出异常,栈展开的时候要局部对象,此时局部智能指针对象的函数 delete...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针

66610

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr、实现Ptr_vector

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...在对象的构造函数中执行资源的获取(指针的初始化),函数中释放(delete 指针)。...中现在裸指针的所有权已经归智能指针所有,由智能指针来管理Node 对象的生存期,故函数中不再需要delete 指针; 的操作。...;如果 std::vector::push_back(val);  失败(operator new 失败),抛出异常,栈展开的时候要局部对象,此时局部智能指针对象的函数 delete...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针

1.8K00

从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)

释放这些资源的任务也是自动完成(外部对象的函数调用内部对象的函数)。...在对象的构造函数中执行资源的获取(指针的初始化),函数中释放(delete 指针)。...中现在裸指针的所有权已经归智能指针所有,由智能指针来管理Node 对象的生存期,故函数中不再需要delete 指针; 的操作。...;如果 std::vector::push_back(val); 失败(operator new 失败),抛出异常,栈展开的时候要局部对象,此时局部智能指针对象的函数 delete...当Ptr_vector 对象销毁时调用函数函数调用clear(),遍历vector,delete 裸指针

1K20

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

使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类自动调用函数函数自动释放资源。...pa ,pb之间互相引用,两个资源的引用计数为2,当要跳出函数时,智能指针pa,pb时两个资源引用计数减一,但是两者引用计数还是为1,导致跳出函数时资源没有被释放(A B的函数没有被调用),如果把其中一个改为...,如对象所在的函数调用完毕时,系统自动执行函数。...如果用户没有编写函数,编译系统自动生成一个缺省的函数(即使自定义了函数,编译器也总是会为我们合成一个函数,并且如果自定义了函数,编译器执行时会先调用自定义的函数调用合成的函数...所以许多简单的类中没有用显式的函数。 如果一个类中有指针,且使用的过程中动态的申请了内存,那么最好显示构造函数销毁类之前,释放掉申请的内存空间,避免内存泄漏。

2.8K30

【笔记】《C++Primer》—— 第二部分:C++标准库

如果open失败,则failbit会被置位,所以open后用if检查一下是好习惯 fstream被时,close自动调用 为了打开其他文件需要close再open,直接open损坏流 每个流都有自己的文件模式...,很多时候用无序容器性能更好 无序容器将哈希值相同的元素储存在同一个桶中,桶中再采用顺序查找,然后元素增多时看情况重整桶的元素以此来保持平均性能,因此自然也就有一批围绕着桶展开的成员函数可供操控。...,并以此管理内存的释放 注意不要把智能指针和内置指针混用,让智能指针和内置指针都指向同一块内存容易导致引用问题,我们将无法确切得知合适这个对象应该被销毁 类似的也不要用智能指针的get函数提取内部的指针出来构造别的智能指针...,因为这样引用计数无法传递,get函数是用来适配一些无法传入智能指针函数而出现的 如果要给智能指针调用新的的删除器函数,需要在构造指针时第二个参数传入一个可调用对象,且此对象的参数必须是一个该类型元素的指针...,用destroy来元素 当需要批量构造元素到这段内存中时,我们可以使用uninitialized系列算法来填充,使用起来类似于copy函数

58630

基础知识_Cpp

如何限制类只能在堆或栈上创建对象 1.编译器在为类对象分配栈空间时,先检查类的函数的访问性,其实不光是函数,只要是非静态的函数,编译器都会进行检查。...如果类的函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将函数设为私有,类对象就无法建立栈上了。 缺点:(1).无法解决继承问题。...(使用delete会报错,因为delete对象的指针,会调用对象的函数,而函数类外不可访问)这种使用方式比较怪异。...一个有指针对象的类中至少要实现哪三个函数 拷贝构造函数、拷贝赋值运算符、函数 如果没有实现拷贝赋值运算符可能遇到什么问题(深拷贝、浅拷贝) 浅拷贝,只拷贝指针的值,深拷贝再开辟一块新空间,连同指针堆中指向的内容一块拷贝过去...,需要自己手动调用函数

1.9K30

整理了70道C语言与C++常见问答题

使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类自动调用函数函数自动释放资源。...pa ,pb之间互相引用,两个资源的引用计数为2,当要跳出函数时,智能指针pa,pb时两个资源引用计数减一,但是两者引用计数还是为1,导致跳出函数时资源没有被释放(A B的函数没有被调用),如果把其中一个改为...由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用指针指向的派生类函数,而派生类的函数又自动调用基类的函数,这样整个派生类的对象完全被释放。...如果函数不被声明成虚函数,则编译器实施静态绑定,删除基类指针时,只会调用基类的函数而不调用派生类函数,这样就会造成派生类对象不完全,造成内存泄漏。...所以将函数声明为虚函数是十分必要的。实现多态时,当用基类操作派生类,时防止只基类而不派生类的状况发生,要将基类的函数声明为虚函数

3K01

《Effective C++》学习笔记

构造//赋值运算 条款05:了解C++默默编写并调用哪些函数 当没有声明时,编译器自动为类创建默认构造函数函数、复制构造函数和赋值构造函数,但如果成员变量中包含引用、const这些不能被改变的值...条款07:为多态基类声明虚函数 如果一个基类可能有多态子类,那么就该声明一个虚函数。 如果一个类有任何虚函数,那么它就应该有虚函数。...条款08:别让异常逃离析函数 函数不要抛出异常,如果函数调用函数可能抛出异常,函数应该捕捉并记录下来然后吞掉他(不传播)或结束程序。...条款09:绝不在构造和过程中调用函数 构造函数函数中不要去调用函数,因为子类构造/时,会调用父类的构造/函数,此时其中的虚函数调用父类的实现,但这是父类的虚函数可能是纯虚函数...条款17:以独立语句将newed对象置入智能指针 如果有函数参数接收智能指针对象,那么该智能指针对象一定要在调用函数前用独立语句去创建,否则在创建所指对象和用该对象绑定智能指针两个操作之间,可能插入一些操作

1.1K20

一些关于广泛使用的C++标准库STL的思考

这里建议序列式容器中使用,换到关联式容器中可能就会无序了。 ---- 小习惯:使用empty来代替检查size()是否为0 事实上empty的典型实现是一个返回size是否返回0的内联函数。...此外,这条原则还指出了其他多种区间函数,比如说批量删除、批量赋值等 ---- 关于容器中存放指针 的确,当一个指针的容器被销毁时,销毁它(那个容器)包含的每个元素,但指针的“函数”是无操作!...,而从没有虚函数的类公有继承是一个大的C++禁忌。...通过没有DeleteObject()); // 虚函数的基类 } // 指针来删除派生对象 以下这个解决方法我倒是没看太懂,是在下技术不够了,希望有大佬看懂了评论区指点指点,万分感谢...使用智能指针。 关于智能指针,等我后天开始研究了那两本书,下一篇会出。

45330

c++构造函数是否可以抛出异常_什么叫抛出异常

因为构造函数中抛出异常,概念上将被视为该对象没有被成功构造,因此当前对象的函数就不会被调用。...,当前对象的函数不会被调用,如果在构造函数中分配了内存,那么造成内存泄露,所以要格外注意。...由于类B的构造函数中抛出了异常,而此异常并未在构造函数中被捕捉,所以导致类B的构造函数执行中断,对象b并未构造完成。类B的构造函数“回滚”的过程中,c的函数和类A的函数相继被调用。...RAII 即资源获取即初始化,也就是说构造函数中申请分配资源,函数中释放资源。因为 C++ 的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候自动调用函数。...,尽管类B构造函数抛出异常导致类B函数未被执行,但类 A 的函数仍然在对象 pA 生命周期结束时被调用,避免了资源泄漏。

1.6K10

C++构造函数抛出异常注意事项

因为构造函数中抛出异常,概念上将被视为该对象没有被成功构造,因此当前对象的函数就不会被调用。...,当前对象的函数不会被调用,如果在构造函数中分配了内存,那么造成内存泄露,所以要格外注意。...由于类B的构造函数中抛出了异常,而此异常并未在构造函数中被捕捉,所以导致类B的构造函数执行中断,对象b并未构造完成。类B的构造函数“回滚”的过程中,c的函数和类A的函数相继被调用。...RAII即资源获取即初始化,也就是说构造函数中申请分配资源,函数中释放资源。因为C++的语言机制保证了,当一个对象创建的时候,自动调用构造函数,当对象超出作用域的时候自动调用函数。...,尽管类B构造函数抛出异常导致类B函数未被执行,但类A的函数仍然在对象pA生命周期结束时被调用,避免了资源泄漏。

2.1K40

两万字总结《C++ Primer》要点

(3)函数 函数:用于释放对象使用的资源,销毁对象的非static数据成员。 class Foo { public: ~Foo(); // 函数,一个类只会有唯一一个函数。...} 一个函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,部分是隐式的。销毁类类型的成员需要执行成员自己的函数。...合成函数:当一个类未定义自己的函数时,编译器会为它定义一个合成函数函数体本身并不直接销毁成员。...::: tip 非虚函数不会发生动态绑定。 ::: 15.7 构造函数与拷贝控制 (1)虚函数 基类中将函数定义成虚函数以确保执行正确的函数版本。...; // 调用Bulk_quote的函数函数阻止合成移动操作。

1.5K30

两万字总结《C++ Primer》要点

(3)函数 函数:用于释放对象使用的资源,销毁对象的非static数据成员。 class Foo { public: ~Foo(); // 函数,一个类只会有唯一一个函数。...} 一个函数中,不存在类似构造函数中初始化列表的东西来控制成员如何销毁,部分是隐式的。销毁类类型的成员需要执行成员自己的函数。...合成函数:当一个类未定义自己的函数时,编译器会为它定义一个合成函数函数体本身并不直接销毁成员。...::: tip 非虚函数不会发生动态绑定。 ::: 15.7 构造函数与拷贝控制 (1)虚函数 基类中将函数定义成虚函数以确保执行正确的函数版本。...; // 调用Bulk_quote的函数函数阻止合成移动操作。

1.7K20

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

函数为什么通常是会做成一个虚函数呢 如果一个类有虚函数,就应该为其定义一个虚函数。...这是因为使用delete操作符释放一个指向派生类对象的基类指针时,如果基类的函数不是虚函数,那么只会调用基类的函数,而不会调用派生类的函数,这样就会导致内存泄漏和未定义行为的问题。...通过将函数定义为虚函数,可以确保释放派生类对象时,先调用派生类的函数,再调用基类的函数,从而避免内存泄漏和未定义行为的问题。...在哪些场景下应用智能指针 我自己是在在动态内存管理中,使用智能指针可以避免手动管理内存的麻烦和出错风险。...class中缺省的函数 没关注 补充: C++中,如果一个类没有显式地定义「构造函数函数、拷贝构造函数、赋值运算符重载函数」,那么编译器自动生成这些函数,这些函数被称为缺省函数

21210

【C++】智能指针

_ptr指针 构造函数时,将指针保存起来 函数时,将指针释放 将申请的资源,交给智能指针对象去管理 (通过这个指针 去构造一个智能指针对象,这个对象会把指针保留起来) ---- 创建对象时,...会调用构造函数,将new int 传给类中的指针,对象会把指针保留起来 v1和v2属于局部对象,出了作用域时,就会调用函数 ,完成释放 若第一个new抛异常,就不会进入构造函数中 若第二个new抛异常...,则调用,将第一个new释放掉 若div抛异常,则v1和v2对象都调用,将第一个new和第二个new都释放掉 通过类的构造和的自动调用,利用对象的生命周期来管理资源,被称之为 RAII 2....,若自己不实现,自动生成,所以必须写 但是写又不知道写什么,所以C++98思路是只声明,不实现 只 类里面声明是不可以的,因为类外可以实现 所以还要声明成私有 C++11版本 使用禁止生成默认函数的关键字...的智能指针指向n1,只有当_prevn1才能,而_prev是随着n2节点 就造成了循环引用,从而导致内存泄漏 ---- 库中为了解决循环引用的问题,所以提出了 weak_ptr(弱指针

14110

Chapter 4: Smart Pointers

p,少一次造成内存泄露,多一次造成未定义行为 通常无法对 p 判断其是否是悬空指针 C++11 中的四种智能指针 std::auto_ptr ( C++98 以后被 std::unique_ptr...在这个情况下,调用者从工厂函数中收到智能指针,然后由调用者来决定它的声明周期,而当指向某个 id 最后一个使用的指针销毁时,对象也会被销毁,那么缓存中的指针就会悬空,因此在后续查询的时候需要检测命中的指针是否已经悬空...原因是:上面改写为只能指针的代码中,没有对 Widget 进行,因此编译器自动生成函数,而在函数中,编译器插入调用 std::unqiue_ptr 的函数代码,默认的器是 delete...为了解决这个问题,我们需要在函数调用时,确保 Widget::pImpl 是一个完整的类型,也就是当 Widget 的 Impl Widget.cpp 中定义之后,类型是完整的,关键就是让编译器在看到...)指针指向的类型必须是完整的 std::shared_ptr 中,自定义器不是指针对象的一部分,也就不要求在编译生成的特定函数(函数,移动函数)对象中指针指向的类型是完整的 7.Summary

1.6K20
领券