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

在构造函数中使用原始指针并打算立即将其包装在智能指针中,这被认为是不好的做法吗?

在构造函数中使用原始指针并打算立即将其包装在智能指针中,被认为是不好的做法。原因如下:

  1. 内存泄漏风险:如果在构造函数中使用原始指针,并在构造函数中发生异常或错误时没有正确释放该指针,就会导致内存泄漏。智能指针的一个主要优势是自动管理内存,可以在对象不再需要时自动释放内存,避免了手动释放内存的繁琐和容易出错的过程。
  2. 所有权管理问题:使用智能指针可以更好地管理对象的所有权。如果在构造函数中使用原始指针并将其包装在智能指针中,可能会导致多个智能指针同时拥有同一个对象的所有权,从而引发悬挂指针或重复释放内存等问题。
  3. 异常安全性:如果在构造函数中发生异常,并且没有正确处理原始指针的释放,可能会导致资源泄漏。而使用智能指针可以提供异常安全性,确保在发生异常时也能正确释放资源。

相反,推荐的做法是在构造函数中直接使用智能指针,而不是原始指针。这样可以确保资源的正确管理和释放,提高代码的可靠性和安全性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云智能图像处理(https://cloud.tencent.com/product/tiip)
  • 腾讯云音视频处理(https://cloud.tencent.com/product/mps)
  • 腾讯云人工智能(https://cloud.tencent.com/product/ai)
  • 腾讯云物联网(https://cloud.tencent.com/product/iotexplorer)
  • 腾讯云移动开发(https://cloud.tencent.com/product/mobdev)
  • 腾讯云对象存储(https://cloud.tencent.com/product/cos)
  • 腾讯云区块链(https://cloud.tencent.com/product/baas)
  • 腾讯云元宇宙(https://cloud.tencent.com/product/mu)
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 里“数组”

至少会带来语法上不便。 问题三:语法问题 C 数组语法设计也绝对称不上有良好可读性。你能一眼看出下面两个声明分别是什么意思?...接下来,我们使用传统下标方式来遍历,输出其中每一项。随即我们展示了 C++ 里通用使用迭代器遍历做法,对其中内容进行累加。最后输出结果。...如果元素类型没有提供一个保证不抛异常移动构造函数,vector 此时通常会使用拷贝构造函数。...因此,我们如果需要用移动来优化自己元素类型的话,那不仅要定义移动构造函数(和移动赋值运算符,虽然 push_back 不要求),还应当将其标为 noexcept,或只容器中放置对象智能指针。...由于它接口跟其他容器更一致,更容易使用在泛型代码。你也可以直接拿两个 array 来进行 ==、< 之类比较,结果不是 C 数组无聊指针比较,而是真正逐元素比较!

11510

C++智能指针

1.智能指针由来 C++,动态内存管理是通过一对运算符来完成,new用于申请内存空间,调用对象构造函数初始化对象返回指向该对象指针。...有时候获得资源拿来赋值(而非初始化)某个对管理对象,但不论哪一种做法,获得一笔资源后应该立即放进资源管理对象。...它具体做法如下: (1)当创建智能指针新对象时,初始化指针,并将引用计数设置为1; (2)当能智能指针类对象作为另一个对象副本时,拷贝构造函数复制副本指向辅助类对象指针增加辅助类对象对基础类对象引用计数...掌握了上面提到C++ STL四种智能指针后,大家可能会想另一个问题:实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。...如果函数使用new分配内存,返还指向该内存指针将其返回类型声明为unique_ptr是不错选择。这样,所有权转让给接受返回值unique_ptr,而该智能指针将负责调用delete。

3.5K30
  • C++智能指针简介

    1.智能指针由来 C++,动态内存管理是通过一对运算符来完成,new用于申请内存空间,调用对象构造函数初始化对象返回指向该对象指针。...智能指针有时需要将其管理对象所有权转移给其它智能指针,使得多个智能指针管理同一个对象,比如C++ STLshared_ptr支持多个智能指针管理同一个对象。...引用计数目的? 引用计数,是资源管理一种技巧和手段,智能指针使用了引用计数,STLstring也同样使用了引用计数配合“写时复制”来实现存储空间优化。...每次创建智能指针时,初始化智能指针并将引用计数置为1;当智能指针q赋值给另一个智能指针r时,即r=q,拷贝构造函数拷贝智能指针增加q指向对象引用计数,递减r原来指向对象引用计数。...有时候获得资源拿来赋值(而非初始化)某个资源管理对象,但不论哪一种做法,获得一笔资源后应该立即放进资源管理对象

    1.1K30

    Java IAQ:很少被回答问题

    Properties例子,很难说契约到底有没有被打破,因为并没有明确指定默认值是否考虑为table实体。 Q:除了继承,还有其它类似的做法? 委托是继承一种替代品。...仅在初始化情况非常复杂(比如,需要用到循环)时候再去使用代码块初始化,这样可以避免多个构造函数重复初始化同样东西。剩下就可以让构造函数去完成了。...从实例创建中区分出类初始化是很重要一点。实例在你利用new来调用构造函数创建。一个类C,是第一次激活使用时候初始化。在这个过程,这个类初始化代码会以文本顺序运行。...调用pool.point(x,y,z) 时会返回数组第一个未被使用Point对象,将其3个变量设置为指定值,并把它标记为已使用。...Yourdon提到,C和汇编语言中,字符串或是数组中使用指针是一种好习惯用法(有人也C++这样做),这种说法并没有错,但是其它语言并没有打算这样做,也并不支持。

    61620

    《Effective C++》学习笔记

    构造/析构/赋值运算 条款05:了解C++默默编写调用哪些函数 当没有声明时,编译器会自动为类创建默认构造函数、析构函数、复制构造函数和赋值构造函数,但如果成员变量包含引用、const这些不能改变值...条款15:资源管理类中提供对原始资源访问 封装了资源管理类后,API有时候往往会要求直接使用原始资源(作为参数类型只能接受原始资源,不接受管理类指针),这时候就需要提供一个获取其原始资源方法。...解决方法有: 调用动作前加上“this->” 使用using声明式来子类声明基类该接口 明确指出调用函数位于基类:Base::xxx(); 以上做法都是承诺调用函数一定会在各种特化基类均声明...做法是声明一个泛化构造函数,也就是定义一个模板构造函数,接收模板参数,声明一个指向真实对象指针,声明一个获取该对象指针get函数,用该get函数放在初始化列表构造模板类。...这样就能使用一种类型特化出自制智能指针构造另一种类型特化出自制智能指针了。同时,初始化列表编译器会为你检查是否允许该类型转换(比如只允许子类往父类转换,不能相反)。

    1.1K20

    堆栈里悄悄话——智能指针

    ,看到之前小哥去了堆区,我打断了指针小个子说话。 2 堆里对象 只见小哥执行malloc函数堆区划了一片空间,接着调用构造函数在那片空间上创建了一个对象。...“这你都不知道,这个new = 内存分配 + 构造函数,而内存分配一般默认就是malloc,不懂还一惊一乍,切~”,指针小个子怼了回来,我真想找个缝躲起来。...,小个子指针有点不太服气。 “当然是内存泄漏啦!像你们直接使用new创建出来对象,程序员们要是忘记写delete释放,那这对象就成为抛弃孤儿,就会白白占用堆空间。...“哦,还没完呢,裸指针还有个毛病就是谁来释放问题,因为你们裸指针就是一个地址,可以函数之间四处传递,最后传来传去,到底谁来释放,是不是还有别的函数和线程使用都搞不清楚了,要是不释放呢,就内存泄漏了...还提供了get()方法提供原始指针遇到你说情况下也能用得上。怎么样,这下服了吧?唉,你别走啊,真小气~” 原来没等他说完,小个子指针已经灰溜溜躲开了。

    31120

    目录1.智能指针作用2.智能指针使用3.智能指针设计和实现

    shared_ptr内部引用计数是线程安全,但是对象读取需要加锁。 初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化。也可以使用make_shared函数初始化。...unique_ptr指针与其所指对象关系:智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权...weak_ptr可以使用一个非常重要成员函数lock()从观测shared_ptr获得一个可用shared_ptr对象, 从而操作资源。...每次创建类新对象时,初始化指针并将引用计数置为1;当对象作为另一对象副本而创建时,拷贝构造函数拷贝指针增加与之相应引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象引用计数(如果引用计数为减至...0,则删除对象),增加右操作数所指对象引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

    1.5K30

    《C++Primer》第十二章 动态内存

    动态内存和智能指针 c++,动态内存管理是通过一对运算符来完成: new:动态内存为对象分配空间返回一个指向该对象指针 delete:接收一个动态对象指针,销毁该对象释放与之关联内存空间...有一种可以避免空悬指针做法指针即将离开其作用域之前释放掉它所关联内存,这样指针关联内存释放掉之后,就没有任何机会继续使用指针了。...// 这段代码抛出来一个异常,且f未被捕获 } // 函数结束时shared_ptr自动释放内存 2.5 智能指针和哑类 包括所有标准库在内很多C++类都定义了析构函数负责清理对象使用资源...T构造函数,用来p指向内存构造一个函数 a.destory(p):p为类型T*指针,此算法对p指向对象执行析构函数 为了使用allocate返回内存,我们必须用construct构造对象...当我们使用完对象之后,必须对每个构造元素使用destroy来销毁它们。 一旦元素销毁后,就可以重新使用这部分内存来保存其他string,也可以将其归还给系统。

    1.4K10

    React Native for Android源码分析 一《JNI智能指针之介绍篇》

    JNI指针 ---- 通常app, JNI提供native函数主要充当Java类扩展,逻辑层Java端,JNI端较少使用OOP设计思想。...JNI指针 ---- 通常app, JNI提供native函数主要充当Java类扩展,逻辑层Java端,JNI端较少使用OOP设计思想。...由上可见,JNI智能指针第一个需求,就是要自动管理jobject生命周期,当进入与离开对应作用域时,需要自动调用对应生命周期创建与销毁函数。这在C++,通常会结合构造与析构函数来进行配对调用。...这样,对jobject访问与操作就会被封装在对应镜像C++对象,相关JNI反射调用细节隐藏,对于其他native模块而言,与Java层交互转化成了与这些镜像C++对象交互,整个实现风格OOP...create工厂方法中使用newInstance构建镜像对象实例,并将其存至局部智能指针local_ref。

    1.2K50

    【FFI】N-APIJS堆对象生命周期管理

    它们都 保存在JS VM堆内存,和 Rust栈内存napi_value可修改原始指针引用。 N-API引用计数 它是指向JS堆对象“FFI引用计数”智能指针(后文有图,应该会更直观些)。...其 保存于JS VM堆内存,和 Rust栈内存napi_ref可修改原始指针引用。即,addon端Rust程序拿到是指向了“智能指针指针”。...JS堆对象向Rust“投影”就更像【智能指针】,而不是“裸奔原始指针。...甚至(重点来了),即便JS端代码刻意保留了已FFI导出堆对象引用,addon端(栈内存)所持有的原始指针依旧会,FFI函数执行之后,丢失其原本指向值和成为“野”指针。...于是,整个设计方案“难点”就聚焦于: 监听智能指针std::rc::Rc引用复本清空事件, 事件处理函数内,调用napi_reference_unref()与napi_delete_reference

    22710

    STL四种智能指针

    意味着,内存资源所有权可以将转移到另一个unique_ptr,并且原始 unique_ptr 不再拥有此资源。实际使用,建议将对象限制为由一个所有者所有,因为多个所有权会使程序逻辑变得复杂。...unique_ptr指针与其所指对象关系:智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权...它具体做法如下: (1)当创建智能指针新对象时,初始化指针,并将引用计数设置为1; (2)当能智能指针类对象作为另一个对象副本时,拷贝构造函数复制副本指向辅助类对象指针增加辅助类对象对基础类对象引用计数...了解STL四种智能指针后,大家可能会想另一个问题:实际应用,应使用哪种智能指针呢? 下面给出几个使用指南。 (1)如果程序要使用多个指向同一个对象指针,应选择shared_ptr。...如果函数使用new分配内存,返还指向该内存指针将其返回类型声明为unique_ptr是不错选择。这样,所有权转让给接受返回值unique_ptr,而该智能指针将负责调用delete。

    2.7K41

    【笔记】《Effective C++》条款1-25

    析构函数尽管调用顺序相反但是思路一致 所以不要在析构/构造过程调用虚函数 补偿方法是将需要让派生类执行函数以非虚函数形式写好, 然后将其所需变量通过构造函数构造初值列中进行传递...., 但是千万不能用拷贝函数调用拷贝函数, 相当于试图构造一个已经存在对象, 很容易导致对象破坏...., 而智能指针是语言范围内一种结构而已 智能指针在内存上与原始指针几乎相同(顶多多一个引用计数器), 速度上也相差无几 三种标准库智能指针, 都在memory里: unique_ptr: 独占指针,..., 同时日常通过重载调用运算来模拟指针方便开发 隐式类型转换可以写, 比较自然, 但是有时有危险 更常见情景是写一个显式get函数来获取原始指针 牢记RAII类不是为了封装数据存在, 而是为了给原始指针加上资源回收功能...写出上面那种一个语句(尤其是函数参数列)执行new, 构造智能指针, 和其它操作代码很危险.

    1.1K30

    C++编程经验(12):C++11新特性

    传递给 updateViaRef 函数 SpecialWidget pw 指针 ---- 智能指针 智能指针是存储指向动态分配(堆)对象指针类。...除了能够适当时间自动删除指向对象外,他们工作机制很像C++内置指针使用对象时候,使用智能指针引用对象时候,使用智能指针。...要使用函数指针使用function进行函数指针模板声明与调用; 实例化function模板所用函数可能有不下于1个参数,旧绑定器已经不行了,用新绑定器来吧; 而函数指针需要从调用函数指针函数那里去获得传入参数...如果对变量 i 加上 volatile 关键字修饰的话,它可以保证当 A 线程对变量 i 值做了变动之后,会立即刷回到主内存,而其它线程读取到该变量值也作废,强迫重新从主内存读取该变量值,这样在任何时刻...另外,如果某个线程 已经执行完任务,但是没有 join 的话,该线程依然会被认为是一个活动执行线程,因此也是可以 join 。 detach: Detach 线程。

    1K20

    智能指针详解

    智能指针使用 下面是一个原始指针智能指针比较示例代码 // 原始指针 void rawptr(){ // 使用原始指针 Obj *rawptr = new Obj("raw pointer...智能指针特点包括: 拥有权管理:智能指针拥有其所指向对象,负责适当时机释放内存。意味着当智能指针超出作用域或不再需要时,它会自动调用析构函数来释放内存。...析构函数处理:智能指针析构函数通常包含了对所拥有对象内存释放操作,确保智能指针销毁时,关联资源也会被释放。这种自动化资源管理有助于避免内存泄漏和资源泄漏。...异常安全性:智能指针异常情况下能够保证资源正确释放。即使发生异常,智能指针也会在其作用域结束时销毁,调用析构函数来释放资源。...智能指针封装了指向堆分配对象原始指针,因此智能指针通常提供直接访问其原始指针方法。 C++ 标准库智能指针拥有一个用于此目的get成员函数

    28540

    智能指针探究

    ,而这样的话,会影响容器内每个元素拷贝赋值 当你用vec1构造vec2时候,那就说明vec1里面的指针,全部为空,当你不知道这个情况下,你使用vec1里面的智能指针,就全部都是空指针了 既然auto_ptr...意味着你不能使用拷贝构造函数或拷贝赋值运算符来创建一个 scoped_ptr对象副本,如果你尝试这样做,编译器将报错 其实scoped_ptr拷贝构造函数声明为private并且是没被定义...当使用new操作符创建一个新对象时,会为该对象分配内存,调用其构造函数来初始化它。当不再需要这个对象时,应该使用delete操作符来删除它。...事实上,当你主线程中使用delete删除对象p时,它会释放该对象所占用内存。但是,并不意味着该内存立即被操作系统回收或其他程序使用。...删除器是一个函数对象,用于智能指针销毁时释放其所指向资源 在这段代码,删除器是一个 lambda 表达式。lambda 表达式是一种匿名函数,它可以捕获上下文中变量并在其函数体中使用

    7810

    C++重要知识点小结---3

    智能指针是一个行为类似指针但也提供其他功能类。 智能指针类实现普通指针行为区别在于:智能指针通常接收指向动态分配对象指针负责删除该对象。...用户分配对象,但由智能指针类删除它,因此智能指针类需要实现复制控制成员来管理指向共享对象指针。只有撤销了指向共享对象最后一个智能指针后,才能删除该共享对象。...此时,基类函数隐藏(注意别与覆盖混淆) 4.以下代码两个sizeof用法有问题?...在这个类包括了指针类成员变量m_data,当类包括指针类成员变量时,一定要重载其拷贝构造函数、赋值函数和析构函数既是对C++程序员基本要求,也是《Effective C++》特别强调条款。...,这个函数使用范围限制声明它模块内;   (4)static成员变量属于整个类所拥有,对类所有对象只有一份拷贝;   (5)static成员函数属于整个类所拥有,这个函数不接收

    90561

    女朋友:七夕,你 HttpServer 又崩了......

    ,我们介绍了使用智能指针几个注意事项,如果不注意这些细节,使用智能指针不仅不能帮你管理内存,而且还会造成难以排查崩溃。...EventLoop 注册读写事件,我们创建 HttpConnection 对象时把 HttpSessionManager 对象 m_pEventLoop 指针通过 HttpConnection 构造函数传递过来...,前者是 HttpServer 对象构造 HttpSessionManager 时传入,也就是说这里 m_pEventLoop  即外部构造 EventLoop 对象。...m_spEventLoop->registerEvent(m_fd, EventType::Read);,此时 m_spEventLoop 虽然是一个智能指针,但是 HttpConnection构造时传入...有的,这就引出了智能指针使用另外一条经验规则:如果打算使用智能指针管理一个堆对象,建议从 new 出来那一刻就让智能指针接管,不要出现一些地方使用智能指针,另外一些地方使用原始指针

    44310

    《Rust避坑式入门》第1章:挖数据竞争大坑滥用可变性

    Rust智能指针通常实现了Deref和Drop trait。 Rust中常用智能指针有以下7种。...智能指针通常实现了Deref和Drop trait,意味着什么? ❓实现了Deref和Drop trait智能指针意味着什么? Deref trait允许智能指针像引用一样解引用。...意味着可以使用*操作符来访问智能指针包含值。允许智能指针方法自动解引用,使其行为更像普通引用。启用了解引用强制转换(deref coercions),允许需要引用地方使用智能指针。...第53行使用Rust标准库thread::spawn函数创建一个新线程。spawn函数接受一个闭(匿名函数)作为参数,返回一个JoinHandle。...指针本身可以修改(即可以指向不同内存位置),指针指向值也可以修改。多个线程共享直接修改它。这种共享可变状态没有任何同步机制,是数据竞争根源。

    51573

    整所大学Linux列入黑名单......

    背后究竟有啥「不可告人」故事呢? 原来是明尼苏达大学一位教授往Linux 内核中提交了恶意代码(补丁),然后将其用于做学术研究。...下图是陆康杰个人介绍: BleepingComputer上,论文研究人员演示了一些实例,其中提交补丁引入了已知安全漏洞: 如上图所示,研究人员尝试代码重现NULL指针取消引用缺陷(CVE-...UMN研究人员论文中说道:“但是,某些任务(例如pf_detect()和pf_exit())将在null之后调用,它们将在不检查其状态情况下更多地中断该指针,从而导致NULL指针出现。”...他们所使用研究方法引起了Linux内核社区强烈不满,截止目前,此事已导致UMN被禁止发表任何与Linux内核有关研究成果。 我们非常重视此事,并立即中止了校内这项研究。...成千上万的人都在维护着这个项目,仍然恶意代码趁虚而入。这些恶意代码被发现唯一原因是明尼苏达大学学者发布论文时候。所以Linux做法还真是无赖。”

    72620

    C++ 引用计数技术及智能指针简单实现

    如何很多对象有相同值,为多个相同值存储多个副本是很浪费空间,所以最好做法是让左右对象都共享同一个值实现。...C++标准库string类采取一种称为”写时复制“技术,使得只有当字符串修改时候才创建各自拷贝,否则可能(标准库允许使用但没强制要求)采用引用计数技术来管理共享对象多个对象。...它具体做法如下: 当创建类新对象时,初始化指针,并将引用计数设置为1 当对象作为另一个对象副本时,复制构造函数复制副本指针增加与指针相应引用计数(加1) 使用赋值操作符对一个对象进行赋值时,...如期,离开大括号后,共享基础对象指针从3->2->1->0变换,最后计数为0时,pa对象delete,此时使用getX()已经获取不到原来值。...但是矩阵类智能指针类设计思想和Point类一样啊,就不能借用?答案当然是能,那就是使用模板技术。为了使我们智能指针适用于更多基础对象类,我们有必要把智能指针类通过模板来实现。

    2.2K41
    领券