结构体和类的区别
- struct 只能包含成员变量,不能包含成员函数。而在 C++ 中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。
- 不同点:
● class 中的成员默认都是 private 的,而 struct 中的成员默认都是 public 的;
● class 继承默认是 private,struct 继承默认是 public;
● class 可以用于定义模板函数,而 struct 不行。
● 实际使用中,struct 我们通常用来定义一些 POD(plain old data) 类型,它是用来描述一种数据类型的特性,主要用于在内存中表示简单的数据结构。
什么是智能指针,C++有哪几种智能指针
智能指针是C++中用来自动管理动态分配内存的一种模板类,维护着一个指向动态分配对象的指针,并在智能指针对象被销毁时,自动释放该内存,从而避免内存泄漏。
C++有以下几种智能指针:
● std::unique_ptr:独占式拥有指针,保证同一时间只有一个unique_ptr指向特定内存,适用于不需要共享所有权的场景,如栈上对象的管理。
● std::shared_ptr:多个shared_ptr可以共享同一内存,使用引用计数机制来管理内存的生命周期,适用于多个对象需要共享同一个资源的场景。
● std::weak_ptr:弱引用,用于解决shared_ptr可能导致的循环引用问题,它不拥有所指向的对象。
智能指针的实现原理是什么
- std::unique_ptr
○ unique_ptr代表独占所有权的智能指针,同一时间只能有一个unique_ptr实例指向特定资源。
○ 它通过析构函数来管理资源的释放。当unique_ptr超出作用域时,会自动调用删除操作符来释放其指向的内存。
○ std::unique_ptr 通过删除复制构造函数和复制赋值运算符来确保所有权的唯一性,但提供移动构造函数和移动赋值运算符,允许所有权的转移。 - std::shared_ptr
○ shared_ptr允许多个指针实例共享对同一资源的所有权,使用引用计数机制来跟踪有多少个shared_ptr指向同一资源。
○ 内部维护一个控制块,通常包含引用计数和资源的原始指针。每当创建一个新的shared_ptr或将一个shared_ptr赋值给另一个时,引用计数增加。
○ 当shared_ptr被销毁或通过标准库提供的reset成员函数重置时,引用计数减少。当引用计数降到零时,控制块会释放资源并自我销毁。 - std::weak_ptr
○ std::weak_ptr 是一种不拥有对象的智能指针,它观察 std::shared_ptr 管理的对象,但不增加引用计数。
○ 它用于解决 std::shared_ptr 之间可能产生的循环引用问题,因为循环引用会导致引用计数永远不会达到零,从而造成内存泄漏。
new和molloc有什么区别
new和malloc在C++中都用于动态内存分配,但它们之间有几个关键的区别:
- 语法层面:
○ new是C++的操作符,可以直接用来分配对象或数组。
○ malloc是一个函数,通常需要包含头文件,并且只分配原始内存。 - 类型安全:
○ new是类型安全的,它会根据分配的对象类型进行正确的内存分配和构造函数调用。
○ malloc 不是类型安全的,它只分配原始内存,不调用构造函数。返回类型是 void*,需要强制类型转换为具体的指针类型。 - 构造与析构:
○ 使用 new 分配的对象在对象生命周期结束时需要使用 delete 来释放,delete 会自动调用对象的析构函数。
○ 使用 malloc 分配的内存需要使用 free 来释放,free 不会自动调用析构函数,因此如果分配的是对象数组,需要手动调用析构函数。 - 异常安全性:
○ new在分配失败时会抛出std::bad_alloc异常。
○ malloc在分配失败时返回NULL指针。 - 管理机制:
○ C++中的new和delete通常由编译器实现,可能包含一些额外的内存管理机制。
○ C语言的malloc和free由C标准库提供,与编译器无关。
总结来说,new和malloc都是动态内存分配的手段,但new提供了类型安全和构造/析构的自动化,而malloc则提供了更底层的内存分配方式,需要手动管理构造和析构。在C++中,推荐使用new来分配对象,以保持类型安全和自动化的资源管理。