当前位置: 首页 > news >正文

广东企业网站模板定制广告手机网站制作

广东企业网站模板定制,广告手机网站制作,建筑之家,做微网站必须要有公众号吗C面试常见问题 - 知乎 智能指针#xff1a; 智能指针#xff08;Smart Pointers#xff09;是一种用于管理动态内存的数据结构#xff0c;通常用于C和某些其他编程语言中。它们提供了更安全和方便的内存管理方式#xff0c;帮助减少内存泄漏和悬垂指针等问题。智能指针…C面试常见问题 - 知乎 智能指针  智能指针Smart Pointers是一种用于管理动态内存的数据结构通常用于C和某些其他编程语言中。它们提供了更安全和方便的内存管理方式帮助减少内存泄漏和悬垂指针等问题。智能指针是与RAII资源获取即初始化编程原则紧密相关的因此它们确保在离开作用域时自动释放分配的内存。 主要的智能指针类型包括 std::shared_ptr共享指针允许多个智能指针共享相同的资源。资源在最后一个引用离开作用域时释放。 std::unique_ptr唯一指针确保只有一个指针可以访问分配的资源。资源在唯一指针离开作用域时释放。 std::weak_ptr弱指针与shared_ptr一起使用用于解决循环引用的问题。弱指针不增加引用计数它只能用于监视资源的生存状态。 智能指针的好处包括 自动内存管理它们负责在资源不再需要时自动释放内存减少了内存泄漏的风险。 减少悬垂指针当资源被释放后智能指针将确保不再引用它从而避免了悬垂指针问题。 简化代码它们可以减少显式的内存管理操作使代码更清晰和安全。 支持多线程某些智能指针类型如std::shared_ptr具有引用计数可以用于多线程环境。 使用智能指针有助于提高C程序的健壮性和可维护性。然而开发者仍然需要小心避免循环引用以确保资源的正确释放。 实现一个智能指针 #include iostreamtemplate typename T class SmartPointer { private:T* ptr;public:// 构造函数SmartPointer(T* p nullptr) : ptr(p) {}// 析构函数~SmartPointer() {delete ptr; // 在析构函数中释放资源}// 拷贝构造函数SmartPointer(const SmartPointerT other) {ptr new T(*other.ptr);}// 赋值运算符SmartPointerT operator(const SmartPointerT other) {if (this other) {return *this;}delete ptr; // 释放当前资源ptr new T(*other.ptr);return *this;}// 解引用操作符T operator*() {return *ptr;}// 成员访问操作符T* operator-() {return ptr;} };int main() {SmartPointerint sp1(new int(42));SmartPointerint sp2 sp1; // 使用拷贝构造函数SmartPointerint sp3(new int(10));sp3 sp2; // 使用赋值运算符std::cout Value from sp1: *sp1 std::endl;std::cout Value from sp2: *sp2 std::endl;std::cout Value from sp3: *sp3 std::endl;return 0; }share_ptr是如何实现的 std::shared_ptr 是C标准库中的智能指针它允许多个std::shared_ptr共享相同的资源并在资源不再需要时自动释放。std::shared_ptr的实现通常基于引用计数它会记录资源被多少个std::shared_ptr共享。以下是std::shared_ptr的基本工作原理 构造和拷贝构造当您创建一个std::shared_ptr时它将创建一个引用计数对象该对象包含两部分信息指向分配的资源的指针和一个引用计数。 引用计数每当您拷贝一个std::shared_ptr或将其作为参数传递给函数引用计数会递增。当析构或赋值操作使引用计数为零时资源会被释放。 资源释放当std::shared_ptr的引用计数变为零它将自动释放关联的资源。这是通过析构函数来实现的当引用计数为零时析构函数被调用资源被释放。 复制和赋值std::shared_ptr支持复制和赋值操作使多个std::shared_ptr可以共享相同的资源而不会出现悬垂指针问题。当一个std::shared_ptr离开作用域或不再需要资源时它的引用计数会减少直到资源不再被引用。 循环引用std::shared_ptr存在循环引用的潜在问题。如果两个或多个std::shared_ptr相互引用它们的引用计数将永远不会变为零导致资源泄漏。为了解决这个问题C11引入了std::weak_ptr允许弱引用资源但不会增加引用计数用于打破循环引用。 std::shared_ptr的实现会维护引用计数并确保在没有引用时释放资源。这是通过使用std::shared_ptr的析构函数来实现的当最后一个std::shared_ptr离开作用域或不再需要资源时析构函数被调用资源得到释放。引用计数的维护是线程安全的这使得std::shared_ptr适用于多线程环境。 实现一个完整的 shared_ptr 需要涉及引用计数、资源管理、拷贝构造、赋值运算符重载等复杂的细节。以下是一个非常基本的示例展示了 shared_ptr 的基本思想但不包括线程安全和其他重要功能。请注意这只是教育目的的示例实际使用时应使用C标准库中的 std::shared_ptr。 #include iostreamtemplate typename T class SharedPtr { public:// 构造函数SharedPtr(T* ptr) : data(ptr), ref_count(new int(1)) {}// 拷贝构造函数SharedPtr(const SharedPtrT other) : data(other.data), ref_count(other.ref_count) {(*ref_count);}// 析构函数~SharedPtr() {if (--(*ref_count) 0) {delete data;delete ref_count;}}// 赋值运算符SharedPtrT operator(const SharedPtrT other) {if (this other) {return *this;}// 减少当前对象的引用计数if (--(*ref_count) 0) {delete data;delete ref_count;}data other.data;ref_count other.ref_count;(*ref_count);return *this;}// 解引用操作符T operator*() {return *data;}// 成员访问操作符T* operator-() {return data;}private:T* data;int* ref_count; };int main() {SharedPtrint sp1(new int(42));SharedPtrint sp2 sp1;SharedPtrint sp3(new int(10));sp3 sp2;std::cout Value from sp1: *sp1 std::endl;std::cout Value from sp2: *sp2 std::endl;std::cout Value from sp3: *sp3 std::endl;return 0; }这个示例演示了一个非线程安全的 SharedPtr 类它能够跟踪引用计数并在引用计数减为零时释放资源。在实际应用中您需要考虑线程安全、更复杂的功能以及更多的边界情况以确保正确和高效的资源管理。最好的选择是使用C标准库中的 std::shared_ptr因为它已经经过充分测试和优化。 shared_ptr使用方法 1. 构造函数std::shared_ptr 可以使用多种构造函数创建其中包括从原始指针、另一个 std::shared_ptr、或者其他智能指针类型创建。 std::shared_ptrint sp1(new int(42)); // 使用原始指针创建 std::shared_ptrint sp2 std::make_sharedint(42); // 使用 make_shared 创建 std::shared_ptrint sp3 sp1; // 使用拷贝构造函数创建拷贝构造函数用于创建一个新的 std::shared_ptr共享相同的资源。 std::shared_ptrint sp1(new int(42)); std::shared_ptrint sp2 sp1; // 使用拷贝构造函数赋值操作符用于将一个 std::shared_ptr 赋值给另一个共享相同的资源。 std::shared_ptrint sp1(new int(42)); std::shared_ptrint sp2; sp2 sp1; // 使用赋值操作符reset 方法用于重置 std::shared_ptr它可以释放资源并指向新的资源。 std::shared_ptrint sp1(new int(42)); sp1.reset(new int(10)); // 重置 shared_ptr释放旧资源use_count 方法用于获取 std::shared_ptr 的引用计数。 std::shared_ptrint sp1(new int(42)); int count sp1.use_count(); // 获取引用计数get 方法用于获取 std::shared_ptr 内部的原始指针。 std::shared_ptrint sp1(new int(42)); int* rawPtr sp1.get(); // 获取原始指针*operator 和 operator-**允许通过 * 和 - 操作符来访问资源。 std::shared_ptrint sp1(new int(42)); int value *sp1; // 解引用操作符 int* rawPtr sp1.get(); int value2 *rawPtr; // 也可以通过原始指针访问operator bool用于检查 std::shared_ptr 是否为空未指向任何资源。 std::shared_ptrint sp1; if (!sp1) {// shared_ptr 为空 }这些方法和操作符使 std::shared_ptr 可以方便地管理资源和共享资源的所有权同时自动处理引用计数和资源释放。 C 中的构造函数有几种 在C中构造函数有几种不同的类型主要分为以下几类 默认构造函数Default Constructor 默认构造函数没有参数用于创建对象的实例。如果您没有为类定义构造函数编译器会为您自动生成一个默认构造函数但如果您自定义了任何构造函数编译器将不再提供默认构造函数。 参数化构造函数Parameterized Constructor 参数化构造函数接受一个或多个参数用于初始化对象的成员变量。它允许您在创建对象时传递参数以自定义对象的初始化。 拷贝构造函数Copy Constructor 拷贝构造函数接受同一类型的对象作为参数用于创建一个新对象新对象的值与原对象相同。它在对象复制时被调用通常在对象传递给函数或通过赋值操作时使用。 移动构造函数Move ConstructorC11及以后 移动构造函数用于将资源从一个对象“移动”到另一个对象而不是进行复制。这提高了性能特别是在处理动态分配内存等资源时。 复制构造函数和移动构造函数可以重载的版本 复制构造函数和移动构造函数可以有多个版本根据参数的不同来重载。例如可以有一个接受常量引用和一个接受非常量引用的版本。 析构函数Destructor 析构函数没有参数用于对象生命周期结束时清理资源。通常用于释放动态分配的内存、关闭文件、释放锁等操作。 委托构造函数Delegating ConstructorC11及以后 委托构造函数是一个构造函数调用另一个构造函数以减少冗余代码。这允许您在一个构造函数中调用另一个构造函数来执行实际的初始化工作。 这些构造函数类型提供了不同的初始化和对象创建方式根据您的需要可以选择适合的构造函数类型。
http://wiki.neutronadmin.com/news/358852/

相关文章:

  • 自己做资金盘网站速升网网站是多少钱
  • 网站找图片做海报侵权培训机构哪家最好
  • 做网站的励志故事海洋观测新闻资讯
  • 湖南手机网站制作公司云虚拟主机怎么做网站
  • 网站毕设四川网站制作成都
  • 免费的网站app软件代运营报价
  • 怎么做网站一个平台网站建设公司出路
  • 在哪里个网站找专业做ps的人竞价推广代运营服务
  • 女室内设计师的出路学seo哪个培训好
  • 想做一个自己的网站怎么做的做推广的网站带宽需要多少钱
  • 电子商务网站建设与完整实例帝国网站模板建设
  • 小店网站怎么做手机网址是什么
  • 有专业设计网站吗怎么做网站icp备案
  • 招聘网站简历数据分析怎么做平台开发需要什么技术
  • 重庆万州网站建设费用手机电脑网站建设
  • 财务公司网站模板下载wordpress插件必备
  • 网站权重到底是什么网站后台管理系统怎么弄
  • 搭建网站的企业福田欧曼故障灯图解大全
  • 鄂州商城网站建设udacity 移动网站开发
  • 怎么用vs2017做asp网站手机网站怎样排版最好
  • 大型门户网站建设流程邢台网站优化
  • 一个空间可以绑定几个网站seo行业网
  • 网站建设审批pinterest网站怎么进
  • 极简个人网站模板国家企业信用信息网官网
  • 做安装系统网站有钱赚吗桂林网站网站建设
  • 医疗集团手机网站建设图片渐隐 网站头部flash
  • 佛山网页网站制作室负责做好网站建设及维护
  • 成都建设官方网站如何设计制作一般的企业网站
  • 电商培训网站翻墙国外网站做兼职
  • 建设网站价格动漫设计与制作属于什么专业类别