当前位置: 首页 > 面试题库 >

使用`as_ptr()`时如何停止内存泄漏?

邬朗
2023-03-14
问题内容

由于这是我第一次学习系统编程,因此我很难将规则束之高阁。现在,我对内存泄漏感到困惑。让我们考虑一个例子。说,Rust正在抛出一个Python将会捕获的指针(指向字符串)。

在Rust中,(我只是发送的指针CString

use std::ffi::CString;

pub extern fn do_something() -> *const c_char {
    CString::new(some_string).unwrap().as_ptr()
}

在Python中,(我取消引用了指针)

def call_rust():
    lib = ctypes.cdll.LoadLibrary(rustLib)
    lib.do_something.restype = ctypes.c_void_p
    c_pointer = lib.do_something()
    some_string = ctypes.c_char_p(c_pointer).value

现在,我的问题是释放内存。我认为应该在Python中将其释放,但随后所有权会突然增加。因为,as_ptr似乎采用了不可变的参考。因此,我对于是否应该在Rust或Python
(或两者)中 释放内存感到困惑。如果是Rust,那么当控制流重新回到Python中时,我应该如何释放它?


问题答案:

您的Rust函数do_something构造一个临时对象CString,将一个指针放入其中,然后 删除CString*const c_char从返回的那一刻起,该无效。如果您每天晚上都在使用,则可能要使用CString#into_ptr而不是CString#as_ptr,因为前者会消耗CString而不分配内存。在稳定的,你可以mem::forgetCString。然后,您可以担心谁应该释放它。

从Python释放将是棘手的或不可能的,因为Rust可能使用其他分配器。最好的方法是公开一个带c_char指针的Rust函数,为该指针构造一个CString(而不是将数据复制到新的分配中)并删除它。不幸的是,中间部分(创建CString)目前暂时无法实现:CString::from_ptr不稳定。

一种解决方法是将
_整个CString_函数传递(指向)Python并提供访问器函数以从中获取char指针。您只需要对进行装箱CString并将其转换为原始指针。然后,您可以使用另一个函数,将指针转换回框并放下。



 类似资料:
  • 我正在使用org.AsynchTtpClient发布异步请求。 在关闭tomcat时,我得到了以下日志: 严重:web应用程序[/test]似乎启动了一个名为[pool-1-thread-1]的线程,但未能停止它。这很有可能造成内存泄漏。 2017年7月4日10:53:00 AM org.apache.catalina.loader.webappclassloaderbase clearRefer

  • TL;dr:如何在没有随机文本的情况下将无符号32位整数转换为chars/uint8_t 好的,我愿意为此牺牲几个声誉点。我需要快速将一个4字节的无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。 这样我就可以读取一个结构,然后将其用作对象,而不是读取它,为每个更改写入它。 但是当我尝试实现一个函数时,我得到了一个泄漏。指针只是不断在函数范围之外添加值。 主要: 和输出: 在我

  • 问题内容: 我们知道node.js为我们提供了强大的功能,但强大的功能带来了巨大的责任。 据我所知,V8引擎不进行任何垃圾收集。因此,我们应该避免什么最常见的错误,以确保没有内存从节点服务器泄漏。 编辑: 对不起,V8确实具有强大的垃圾收集器。 问题答案: 据我所知,V8引擎不进行任何垃圾收集。 V8内置了强大而智能的垃圾收集器。 您的主要问题是不了解闭包如何维护对外部函数的范围和上下文的引用。这

  • 问题内容: 我正在设计一个Web应用程序,该应用程序旨在显示一堆使用AJAX定期更新的数据。一般的使用场景是用户将整天保持打开状态,然后不时浏览一下。 我遇到的问题是浏览器的内存占用量随时间缓慢增长。Firefox和IE 7(尽管不是Chrome)都在发生这种情况。几个小时后,它可能导致IE7占用约200MB的内存,而FF3导致占用约400MB的内存。 经过大量测试,我发现只有在响应AJAX调用时

  • 各位,我使用插件cargo-maven2-plugin在Tomcat8上运行集成测试(等待tomcat8-maven-plugin) 不幸的是,当我停止容器时,我有这样一个堆栈:

  • 问题内容: 我怀疑我们的ActiveMQ连接桥中存在严重的内存泄漏- 我们看到的是典型的内存泄漏模式(应用程序加载正常,如果长时间运行或在短时间内一次又一次地重新启动,则会降低速度) 。我查找了发现Java内存泄漏的现代最佳实践,许多开发人员似乎正在放弃传统工具(如jhat / jmap)来代替new(er)。 启动此工具(并花几个小时阅读其教程)后,我便能够为CPU和内存拍摄探查器快照。 在这一