具有 malloc 和 free 的共享指针

2024-01-19

我在包含 c 和 cpp 的大型应用程序中工作。所有文件都保存为 cpp 扩展名,但代码是用 c 风格编写的。我的意思是它是定义结构而不是类通过 malloc 和 realloc 和 calloc 分配内存。最近他们安装了 boost 库所以我计划将其用于我现有的代码库所以我有一些以下问题。

  1. 我可以将 std::shared_ptr 与 malloc 和 free 一起使用吗?
  2. 如果是,有人可以指出我的示例代码库吗?
  3. 如果我在应用程序中创建 std::shared_ptr 并将此指针传递给另一个使用 malloc 或 calloc 的函数,是否会影响任何功能?

或者换句话说:

对于以下代码,如何使用 std::shared_ptr 实现类似的功能:

void allocateBlocks(int **ptr, int *cnt)
{
    *ptr = (int*)malloc(sizeof(int) * 10);
    *cnt = 10;
    /*do something*/ 
}

int main()
{
    int *p = NULL;
    int count = 0;
    allocateBlocks(&p, &count);
    /*do something*/

    free(p);
}

我们调用一些函数,它们接受双指针并填充其应用程序内的结构并使用 malloc。我们可以将这些指针分配给 std::shared_ptr 吗?例如:

typedef struct txn_s
{
    int s;
    int d;
    int *e;
} txn_t;

typedef boost::shared_ptr<txn_t> tpointer;

tpointer((txn_t*)::malloc(sizeof(txn_t),::free));

我可以将shared_ptr与malloc和free一起使用吗?

Yes.

谁能指出我的示例代码库。

您需要提供一个自定义删除器,以便使用以下方式释放内存free而不是默认的delete。这可以是一个指向free函数本身:

shared_ptr<void> memory(malloc(1024), free);

请记住malloc and free只处理原始内存,并且您负责正确创建和销毁您可能想要保留在该内存中的任何重要对象。

如果我在应用程序中创建shared_ptr并将此指针传递给另一个函数(如果它们使用malloc或calloc)。它会影响任何功能吗?

我不太明白这个问题。你可以用这个shared_ptr如果您要问的话,可以与“正常”共享指针互换。类型擦除确保指针的用户不会受到不同类型删除器的影响。与任何共享指针一样,如果使用以下命令提取原始指针,则必须小心一点get();具体来说,不要做任何可能free它,因为您已经不可撤销地将所有权分配给共享指针。

我们调用了一些接受双指针并填充其应用程序内的结构并使用 malloc 的函数,我们可以将这些指针分配给shared_ptr吗?

我猜你的意思是这样的:

double * make_stuff() {
   double * stuff = static_cast<double*>(malloc(whatever));
   put_stuff_in(stuff);
   return stuff;
}

shared_ptr<double> shared_stuff(make_stuff(), free);

更新:我没有发现短语“双指针”,我假设您的意思是使用指针的 C 风格来模拟引用来模拟返回值;你也可以那样做:

void make_stuff(double ** stuff);

double * stuff = 0;
make_stuff(&stuff);
shared_ptr<double> shared_stuff(stuff, free);

如何处理 realloc 和 calloc

可以用以下结果初始化共享指针calloc,或任何其他返回要释放的内存的内容free。你不能使用realloc, since shared_ptr已获得原始指针的所有权,并且在不调用的情况下不会释放它free.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 malloc 和 free 的共享指针 的相关文章

随机推荐

  • 构建发布时出现颤动警告

    当我尝试构建 release 我的应用程序时 我不断收到这些红色警告 尝试扑干净 flutter clean cache 没有任何作用 所有包都是最新的 我的构建 Gradle buildscript ext kotlin version
  • 高效地将字节数组转换为十进制

    如果我有一个字节数组并且想要转换该数组的连续 16 字节块 其中包含 net 的表示形式Decimal 转化为适当的Decimalstruct 最有效的方法是什么 在我正在优化的情况下 以下代码在我的分析器中显示为最大的 CPU 消耗者 p
  • 如何在.NET Framework 3.5上使用Stream.CopyTo?

    我找到了上传代码 该代码包含Stream CopyTo method Example file Stream CopyTo requestStream NET Framework 4 0 如何将 file Stream 复制到 reques
  • 比较 list 类型的 Python 字典值,看看它们是否按顺序匹配

    prefs s1 a b c d e s2 c d e a b s3 a b c d e s4 c d e b e 我有一本字典 我想比较每个键的值 类型 列表 以查看它们是否按该顺序存在 因此 本质上我试图迭代每个键值对 并将列表类型的值
  • 在 Android 中从 Facebook 检索用户名和性别

    这就是我检索存储在共享首选项中的信息 然后比较用户名和密码是否存在的方法 如果用户登录 我可以显示另一个活动 SharedPreferences 设置 getSharedPreferences logindetails 0 String u
  • Java 中的悬空线程

    Java 中的悬空线程会发生什么 就像我创建一个应用程序并且它生成多个线程一样 其中一个线程未完成 主程序在此之前完成 这条悬空的线会发生什么 它会无限地留在线程池中还是 JVM 将在阈值时间段后杀死线程 这取决于线程是否被标记为 守护进程
  • 在 char 中分配多个字符

    为什么这个程序给出输出 y include
  • 如何对结构体数组进行排序

    如何按项目名称的字母顺序对 oo 结构数组进行排序 oo struct Item Quill Ink Pen Pencil Cost 10 2 1 我尝试使用 sort 函数但它不起作用 谢谢 首先索引您的字段 在本例中oo Items它返
  • jQuery 泄漏问题已解决,但为什么呢?

    我正在开发一个包含大量 JavaScript 的大型企业应用程序 够了 我不可能遍历并修复过去 5 年开发中创建的所有小循环引用 在研究解决方案时 我遇到了这个小的 jQuery 黑客 补丁 http kossovsky net index
  • Java邮件超时和连接超时处理

    我正在使用 JavaMail 将电子邮件请求发送到 SMTP 服务器 我想同时设置 邮件 smtp 连接超时 and 邮件 smtp 超时 我的代码中的属性 以编程方式 我想在以下情况下捕获两者timeout and or 连接超时Java
  • 获取过时的 Composer 软件包列表

    我想获取过时的软件包列表 这些软件包将在我发布时更新composer update 作曲家有这样的功能吗 如果没有 有没有办法做到这一点 有或没有作曲家 Update Since Composer v1 1 2016 年 5 月 https
  • Django - postgres:如何在 JsonB 字段上创建索引

    我想允许在 ID 上的 JsonB 字段上建立索引 该 ID 深入到我们 Django 项目中的 json 数据的几个级别 JSONB 数据如下所示 foreign data some key val src data VEHICLE ti
  • 以编程方式卸载/删除 Firefox 扩展?

    有没有办法以编程方式卸载 Firefox 扩展 如果是 是否可以从其他扩展执行此脚本 使用以下方式获取附加组件的参考AddonManager getAddonByID https developer mozilla org en US Ad
  • 安装 RMySQL 时出错

    在我的 Linux 机器上安装 RMySQL 花了很长时间 但在更改环境变量并复制并粘贴 lib dll 文件后我能够安装它 然而 我现在正在尝试在我的64位window机器上安装RMySQL 但到目前为止两天还没有任何进展 运行命令 后它
  • Angular 6 材质:mat-tab-link 通过下划线选择

    我有一个mat tab nav bar我的网站的导航栏 但是mat tab link蓝色下划线条不会追随活动按钮 它只是停留在第一个按钮上 不会移动 尽管背景颜色发生变化 但按钮确实会变成活动状态 并且它们可以很好地路由到相应的页面 这是a
  • 如何根据子视图的高度设置父视图的高度

    我想写一个定制的家长View其中包括其中之一Text组件子视图或两个Text组件子视图 有没有办法设置父级View的高度基于Text视图的高度 class ParentView extends Component constructor p
  • 如何使用cargo部署特定的子项目:start using maven

    我有一个开发的应用程序 我只是想让构建过程变得简单 父级的 POM 文件如下所示
  • javax.mail.MessagingException:无法连接到 SMTP 主机:smtp.gmail.com,端口:25;

    我用来发送简单邮件的代码 import javax mail import javax mail internet import java util import java io import javax activation DataHa
  • 简单正则表达式的困难(匹配前缀/后缀)

    我正在尝试开发一个将在 C 程序中使用的正则表达式 我最初的正则表达式是 lt w 它成功匹配 foo 匹配但从输出中排除左括号和右括号 以生成简单的 foo 但是 如果我将正则表达式修改为 lt w 我尝试与 foo 匹配 但它无法匹配
  • 具有 malloc 和 free 的共享指针

    我在包含 c 和 cpp 的大型应用程序中工作 所有文件都保存为 cpp 扩展名 但代码是用 c 风格编写的 我的意思是它是定义结构而不是类通过 malloc 和 realloc 和 calloc 分配内存 最近他们安装了 boost 库所