memory-management 相关问题

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

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

将其中一个字段是另一个数组的结构数组传递给函数

这是我的结构。 类型定义结构{ uint8_t *数据; size_t 尺寸; } 缓冲; 我在我的主函数中像这样初始化它。 缓冲区*数组; 数组 = calloc(255, sizeof(*array)); //

回答 1 投票 0

我无法用C++实现简单的内存分配器

我正在尝试实现一个简单的分配器来使用向量,但我不明白为什么它不起作用,我找不到如何做得更好的信息,请告诉我! 输出显示“

回答 1 投票 0

C#内存地址和变量

在C#中,有没有办法 获取存储在a中的内存地址 引用类型变量? 获取a的内存地址 多变的? 编辑: 整数我; int* pi = &i; 如何打印 pi 的十六进制值?

回答 4 投票 0

正确重载new/delete new[]/delete[]

这是我之前问题的后续, 使用 malloc 初始化类 该问题的接受答案有效,并在 avr-gcc 上为我提供了新的/删除的功能,这是问题所在,但我超载了......

回答 2 投票 0

为什么在多个线程上运行时快速内存写入比在单个线程上运行时花费更多时间?

我有一个程序,它分配一些内存(2亿个整数),进行一些快速计算,然后将数据写入分配的内存。 当在单线程上运行时,该过程大约需要 1 ...

回答 1 投票 0

FLINT lib:如何删除多项式

在 FLINT 库中,我们有函数 fmpz_poly_clear 可以从内存中清除 fmpz_poly 多项式。但我使用的是这个库的 C++ 接口,所以,我的多项式是

回答 1 投票 0

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