memory-management 相关问题

动态分配和释放部分物理内存的过程,以便在请求者之间尽可能公平并且没有饥饿的情况下响应程序请求。

最佳适应分配:当所有块大小相同时会发生什么?

如图所示,每个块的大小为 2 KB。 如果要求我分配 1 KB 内存,最佳拟合算法会分配哪个块?假设所有块的大小相同,那么...

回答 1 投票 0

当 Marshal.FreeHGlobal() 失败时,如何确保此共享库中的内存安全?

我有一个在 Unity 项目中使用的 C# 脚本。 C# 脚本导入一个 Dll,这是我用 C++ 编写的函数。在我的 C# 脚本中,我想调用 C++ 函数,对从...返回的数据执行一些操作

回答 1 投票 0

逗号运算符安全地用于在 C 中返回指针

以下代码安全吗?宏 gen_call() 返回的 ptr 是否有可能 可能包含垃圾值,因为它未初始化为 NULL。我假设逗号操作...

回答 2 投票 0

Linux中的堆内存是连续的吗?

我正在查看 brk(2) 的手册页,它说它会增加程序中断,因此会向堆分配更多内存。然而,根据我的理解,堆内存并不总是如此

回答 1 投票 0

在自己的进程中初始化SharedWorker?

我正在开发一个Web应用程序,需要在浏览器上加载非常大的数据集,此外,我还需要在SharedWorker上加载大量数据。 当前浏览器(Chrome?)的限制设置了...

回答 1 投票 0

是否可以获得'new'分配的内存块大小?

你好,我需要记录我的堆,但现在我只是想用我的函数重载“new”运算符。 我需要总结在 malloc() 或 Heap* 之后增加的实际内存字节数...

回答 2 投票 0

float(*vals)[n] = malloc(sizeof(float[n]))有什么作用?

维基百科页面解释了什么是可变长度数组 (VLA),列出了以下 C99 示例代码: 浮点数 read_and_process(int n) { float (*vals)[n] = malloc(sizeof(float[n])); 对于(...

回答 2 投票 0

谁以及如何生成虚拟/逻辑地址?如果是编译器、链接器、加载器,会造成混乱

我知道当我编译一个程序然后用 objdump 检查时,我有地址。这些是相对地址。 但如果它是一个 C 程序,并且我 printf 带有 %p 一个指针,那就是虚拟/逻辑

回答 1 投票 0

从内存节点删除变量.JS

我知道,例如,c++有类似delete变量的东西,它会从内存中删除。 JS中有这样的东西吗? 例如,我有 var canSendRequest = true;然后...

回答 3 投票 0

如何估计调用 System.gc() 时剩余的内存量?

我有一些数据处理代码,使用以下配方: 读入内存中尽可能多的数据(称之为“块”) 对 chunk 进行处理 将处理后的块写入磁盘

回答 8 投票 0

考虑到内存管理,如何交换两个变量的值?

我想交换两个变量的值。这是我尝试过的: 方法一: 整数a = 5,b = 6; int 温度 = a; a = b; b = 温度; 方法2: 整数a = 5,b = 6; int *p = a; a = b; b = p; 方法三: int a =...

回答 2 投票 0

交换两个变量值

方法一: 整数a = 5,b = 6; int 温度 = a; a = b; b = 温度; 方法2: 整数a = 5,b = 6; int *p = a; a = b; b = p; 方法3: 整数a = 5,b = 6; 一个=...

回答 1 投票 0

使用 RefCell 和 Rc 处理循环图中的内存泄漏

我按照 https://ricardomatins.cc/2016/06/08/interior-mutability 中提到的方法使用 Rc 和 RefCell 在 Rust 中创建图形。 类型 NodeRef = Rc 我遵循 https://ricardomatins.cc/2016/06/08/interior-mutability 中提到的方法,使用 Rc 和 RefCell 在 Rust 中创建图形。 type NodeRef<i32> = Rc<RefCell<_Node<i32>>>; #[derive(Clone)] // The private representation of a node. struct _Node<i32> { inner_value: i32, adjacent: Vec<NodeRef<i32>>, } #[derive(Clone)] // The public representation of a node, with some syntactic sugar. struct Node<i32>(NodeRef<i32>); impl<i32> Node<i32> { // Creates a new node with no edges. fn new(inner: i32) -> Node<i32> { let node = _Node { inner_value: inner, adjacent: vec![] }; Node(Rc::new(RefCell::new(node))) } // Adds a directed edge from this node to other node. fn add_adjacent(&self, other: &Node<i32>) { (self.0.borrow_mut()).adjacent.push(other.0.clone()); } } #[derive(Clone)] struct Graph<i32> { nodes: Vec<Node<i32>>, } impl<i32> Graph<i32> { fn with_nodes(nodes: Vec<Node<i32>>) -> Self { Graph { nodes: nodes } } } 我认为这种方法在循环图的情况下会导致内存泄漏。我该如何解决这个问题? 您不必阅读博客文章即可找到答案,只需阅读文档: Rc指针之间的循环永远不会被释放。因此,Weak 用于打破循环。例如,一棵树可以具有从父节点到子节点的强 Rc 指针,以及从子节点返回到其父节点的 Weak 指针。 另请参阅: 有没有一种方法可以在没有运行时开销的情况下构建具有循环链接的结构? 在 Rust 中实现类图数据结构 Rust 中的递归数据结构 Rust 并不是为具有任意反向链接的编程结构(例如图形)而设计的。您可能会寻求自己进行释放,以便可以保留任意边缘。幸运的是,Rust 足够灵活,可以几乎无缝地满足您的场景。 这是一种可能的解决方案。 首先,定义两个宏用于将原始指针转换回借用指针: // Given a class or array pointer, transforms it to a mutable reference #[macro_export] macro_rules! modify { ($ptr:expr) => { (unsafe { &mut *$ptr }) } } // Given a class or array pointer, transforms it to a read-only reference #[macro_export] macro_rules! read { ($ptr:expr) => { (unsafe { &*$ptr }) } } 然后,修改引用,使其成为真正的指针。我在下面添加方法来检查它是否为空,但如果您愿意,也可以使用选项类型。请注意,我将您的类型参数从 i32 更改为 I,因为类型参数大写更符合习惯。 type NodeRef<I> = *mut _Node<I>; pub fn NullNodeRef<I>() -> NodeRef<I> { std::ptr::null_mut() } pub fn IsNullNodeRef<I>(node: NodeRef<I>) -> bool { node.is_null() } 现在您可以使用相同的布局重写节点结构: #[derive(Clone)] // The private representation of a node. struct _Node<I> { inner_value: I, adjacent: Vec<NodeRef<I>>, } #[derive(Clone)] // The public representation of a node, with some syntactic sugar. struct Node<I>(NodeRef<I>); 要创建节点,您需要在堆上分配它,这样您就可以检索到稳定的地址,并且 Rust 不会释放它。 impl<I> Node<I> { // Creates a new node with no edges. pub fn new(inner: I) -> Node<I> { let node_ref = Box::into_raw(Box::new(_Node { inner_value: inner, adjacent: vec![] })); Node(node_ref) } 作为奖励,我添加了一个函数来检查一个节点是否是另一个节点的邻居,以演示宏的使用read!(): pub fn is_pointing_to(self, other: &Node<I>) -> bool { let this_node = self.0; let other_node = other.0; read!(this_node).adjacent.contains(&other_node) } 您可以使用 add_adjacent 宏方便地重写原始函数 modify!()。请注意,不再需要克隆引用,因为引用具有复制语义。 // Adds a directed edge from this node to other node. pub fn add_adjacent(&mut self, other: &Node<I>) { modify!(self.0).adjacent.push(other.0); } } 现在您可以定义图表,但到目前为止它只拥有地址,而不拥有对象本身。因此,您需要实现 Drop 特征,以便您可以手动释放内存: #[derive(Clone)] struct Graph<I> { nodes: Vec<Node<I>>, } impl<I> Graph<I> { fn with_nodes(nodes: Vec<Node<I>>) -> Self { Graph { nodes: nodes } } impl <I> Drop for Graph<I> { fn drop(&mut self) { for node in &self.nodes { unsafe { drop(Box::from_raw(node.0)); } } } } } 免责声明:手动管理内存很容易出错,除非必要,否则我不建议这样做。 我发明这些宏是因为我负责将代码生成器从 Dafny 编写到 Rust,而 Dafny 是一种安全的语言,没有所有权的概念,但可以安全地释放。因此,我生成的代码将使用所有这些宏,但以可证明安全的方式。手动使用它们的风险和收益由您自行承担。 但是,通过这种方法,您可以避免任何内存泄漏。

回答 2 投票 0

laravel 4 artisan 命令内存问题

我编写了一个 artisan 命令,将练习从数据库导出到可在 Moodle 等电子学习系统中使用的独立包,... 这是一个巨大的练习量,过了一段时间...

回答 2 投票 0

Delphi 如何管理为作为参数创建的对象分配的内存?

标题可能看起来有点令人困惑,但我的问题的核心是:在以下两种情况下分配的内存会发生什么? 场景一: 变量 FHTTP响应:IHTTP响应; ...

回答 1 投票 0

推荐使用哪种 Python 内存分析器? [已关闭]

我想知道我的Python应用程序的内存使用情况,特别想知道哪些代码块/部分或对象消耗了最多的内存。 谷歌搜索显示商业版是Python

回答 8 投票 0

限制 Mac-OS X 10.8 中进程的内存分配

我想控制Mac-OS X 10.8中进程可以使用的最大内存。我觉得设置 ulimit -v 应该可以实现目标,但似乎并非如此。我尝试遵循简单的通讯...

回答 2 投票 0

在具有大量重定向的 nginx 中无法分配内存错误

我在 nginx 中遇到内存分配错误。我已经为 nginx 上的许多站点配置了反向代理,我将其用作两个后端节点之间的简单负载均衡器。站点的典型配置

回答 1 投票 0

重复分配相同大小的字节数组,用池替换?

作为内存分析的一部分,我们发现了以下内容: 实时分配的堆栈类百分比 排名 自累加字节 objs 字节 objs 跟踪名称 3 3.98% 19...

回答 4 投票 0

Linux 内核中的清零页是什么?

在Linux内核中,“清零页面”实际上意味着什么? 我尝试过将其与免费页面相关联,但没有多大意义。

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.