c++语言基础篇
1.说说智能指针
回答:首先智能指针被发明出来是为了防止内存泄漏,避免程序员忘记释放申请的内存。由于智能指针是一种类,超出了类的作用域,会自动调用析构函数释放资源。因此不需要手动释放内存。
常用的接口
T* get()//获取裸指针
T* operator*()//重载取值运算符
T* operator->()
T& operator=(const T& val);
T* release()//将智能指针内部的裸指针初始为null,不改变指向的内存
void reset (T* ptr = nullptr) //释放指针所指向的内存,如果传了个指针,改智能指针将会内部初始化为改值,记住只能传裸指针,但是不要用reset来进行复制!,因为这不会增加引用计数,两个指针的引用计数是独立的。
1.unique_ptr
不能进行复制得本质是删除了拷贝构造函数和拷贝赋值运算符。
但是是有移动赋值的!
删除器的使用
定义删除器,然后模板中为两个参,第一个是托管的类型名,第二个是删除器类型,指针的参数中也是,(但是这里的第一个参数是指针类型,和直接创建智能指针有些不同)
#include <iostream>
#include <memory>
// 自定义删除器
void myDeleter(int* p) {
std::cout << "Custom deleter called. Deleting resource.\n";
delete p;
}
int main() {
// 创建 unique_ptr,使用自定义删除器
std::unique_ptr<int, decltype(&myDeleter)> ptr(new int(42), myDeleter);
std::cout << "ptr points to " << *ptr << std::endl;
// 当 ptr 超出作用域时,myDeleter 将被调用来删除资源
return 0;
}
2.shared_ptr
和unptr一样都支持异常安全,只要超出了作用域都会释放资源
会有循环引用问题
A类中有一个b的shared_ptr,B类中有一个a的shared_ptr,
形成了一个闭环,可以想象一下内部布局,当要释放A的时候,A中有一个b的指针计数为1,释放B的时候,B中有一个a的技术为1,所以永远无法释放,解决方法就是把其中一个换位weak_ptr,因为wptr不会增加引用计数,所以也不会阻止对象销毁。
2.const和static的区别
static:
修饰局部变量:static让变量生命周期延长到整个程序结束,但是作用域还是限制在语句块内
修饰全局变量:会把改变量限制在只在该文件内可见
修饰函数:同上
修饰类成员变量和成员函数:让成员变量和成员函数属于类而不是对象。注意 static函数没有this指针,所以也就不能用visual来修饰,this->visual->ctable->virtual function。也只能访问static修饰得成员。
其中私有static和公有也是有区别的,私有只能被类的内部访问,公有可以被外部访问
const:
3.说说类和对象
私有成员不能被继承,公有和保护可以被继承,公有继承不改变变量隐私,保护继承全部变为保护,私有继承全部变为私有
Top comments (0)