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

C++与Rust那些事之跳过析构函数

C++与Rust那些事之跳过析构函数

在Rust中mem::forget用于防止对象的析构,跳过清理工作,从而让资源的释放交给其他机制管理。

例如:

let file = File::open("foo.txt").unwrap();
mem::forget(file);

那么在C++中如何防止析构?即跳过析构函数呢?

本节将给出三种办法,完整代码示例也放于星球。

1. placement new

placement new可以让我们手动管理对象的构造和析构。如果不手动调用对象的析构函数,我们就可以跳过对象的析构,从而实现类似mem::forget的效果。

例如:

alignas(Foo) std::byte storage[sizeof(Foo)];  // 分配对齐的原始内存块
Foo* pfoo = new (storage) Foo();  // 在这块内存上构造Foo对象

在上面的代码中,placement new创建了对象pfoo,但我们不调用析构函数,这样可以跳过对象的清理逻辑。

2. 使用智能指针的自定义删除器

另一种实现类似功能的方法是通过自定义智能指针的删除器,防止对象被销毁。我们可以定义一个不执行任何操作的删除器,从而避免析构函数的调用。

std::unique_ptr<Foo, NoOpDeleter> pfoo(new Foo(), NoOpDeleter{});

使用自定义的删除器NoOpDeleter,我们可以防止std::unique_ptr在离开作用域时调用析构函数,从而实现类似mem::forget的效果。

3.union

union的方案很神奇,大家知道原理吗?欢迎留言区一起讨论~

template <class T>
union Wrapper {
  T value;
  ~Wrapper() {}
};

struct Foo {
  ~Foo() { std::cout << "dtor foo\n"; }
};

Wrapper<Foo> f; 
// f.value.~Foo);  必须手动调用

欢迎留言区讨论~

一起探索更多C++项目/知识~

9a5c5ed6da9480b21bd20074f55b5f2d.png

往期推荐:

向量数据库milvus源码剖析之开篇

热度更新,手把手实现工业级线程池

玩转cpp小项目星球3周年了!

b0a8e7a95cf56384c6ab425ea7f4924e.jpeg


http://www.kler.cn/news/342748.html

相关文章:

  • 杨中科 ASP.NETCORE 异步编程二
  • 【golang】gorm 使用map实现in 条件查询用法
  • 大数据面试-笔试SQL
  • OpenCV视频I/O(19)视频写入类VideoWriter之释放 VideoWriter 对象占用的资源函数release()的使用
  • vue 深拷贝和浅拷贝的区别
  • kafka和zookeeper单机部署
  • 制作一个流水灯,控制发光二极管由上至下再由下至上反复循环点亮显示,每次点亮一个发光二级管(Proteus 与Keil uVision联合仿真)
  • 控制台java原生工具打包jar文件
  • 51c自动驾驶~合集3
  • 模块化沙箱的功能特点
  • 数据结构之——树形结构
  • 多线程实践(一)——# 基于多线程实现的并发服务器
  • 计算机毕业设计 基于Python的豆果美食推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • Python知识点:基于Python工具,如何使用PyTorch进行图像分类
  • 仿IOS桌面悬浮球(支持拖拽、自动吸附、自动改变透明度与点击、兼容PC端与移动端)
  • Java项目: 基于SpringBoot+mybatis+maven+vue健身房管理系统(含源码+数据库+毕业论文)
  • 查询数据库绘制历史曲线
  • C++ socket编程(1)
  • 你知道C++多少——栈和队列
  • Pr 视频效果:元数据和时间码刻录