Questions tagged «memory-management»

动态分配和释放部分物理内存的过程,以响应程序请求(如果可能),请求者之间保持公平且无饥饿。

8
brk()系统调用做什么?
根据Linux程序员手册: brk()和sbrk()更改程序中断的位置,该位置定义了进程数据段的结尾。 数据段在这里意味着什么?仅仅是数据段或数据,BSS和堆的组合? 根据Wiki: 有时,数据,BSS和堆区域统称为“数据段”。 我没有理由仅更改数据段的大小。如果是数据,BSS和堆一起使用,则有意义的是堆将获得更多空间。 这使我想到了第二个问题。到目前为止,在我读过的所有文章中,作者都​​说堆向上增长,而堆栈向下增长。但是他们没有解释的是当堆占据了堆和栈之间的所有空间时会发生什么?
184 c  linux  unix  memory-management  brk 

9
Python内存泄漏
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 去年关闭。 改善这个问题 我有一个长时间运行的脚本,如果让脚本运行足够长的时间,它将消耗系统上的所有内存。 在不详细介绍脚本的情况下,我有两个问题: 是否有可遵循的“最佳实践”,以防止泄漏发生? 有什么技术可以调试Python中的内存泄漏?



9
用块保留“ self”上的循环
恐怕这个问题是很基本的,但是我认为它与许多进入块的Objective-C程序员有关。 我所听到的是,由于块将捕获在其中引用的局部变量作为const副本捕获,self因此,如果要复制该块,则在块内使用会导致保留周期。因此,我们应该用来__block强制直接处理该块,self而不是复制它。 __block typeof(self) bself = self; [someObject messageWithBlock:^{ [bself doSomething]; }]; 而不只是 [someObject messageWithBlock:^{ [self doSomething]; }]; 我想知道的是以下内容:如果是这样,是否有办法避免丑陋(除了使用GC外)?

11
指向子类的指针上的delete是否调用基类的析构函数?
我有一个class A使用堆内存分配为其字段之一。类A被实例化并作为指针字段存储在另一个类(class B。 当我完成了类B的对象时,我会调用delete,我假设它调用了析构函数...但是这是否也调用了类A的析构函数? 编辑: 从答案中,我认为(如果不正确,请编辑): delete B实例的调用B ::〜B(); 哪个电话 A::~A(); A::~A 应该显式地deleteA对象的所有堆分配的成员变量; 最终,将存储该类B实例的内存块返回到堆-当使用new时,它首先在堆上分配一个内存块,然后调用构造函数对其进行初始化,现在在所有析构函数都被调用以最终确定对象之后对象所在的块返回到堆。




13
“在编译时分配的内存”的真正含义是什么?
在像C和C ++这样的编程语言中,人们经常引用静态和动态内存分配。我理解这个概念,但是“在编译时分配(保留)所有内存”这句话总是让我感到困惑。 据我了解,编译将高级C / C ++代码转换为机器语言并输出可执行文件。如何在已编译文件中“分配”内存?难道不是所有虚拟内存管理工具都总是在RAM中分配内存吗? 按照定义,内存分配不是运行时的概念吗? 如果我在C / C ++代码中创建一个1KB的静态分配变量,这将使可执行文件的大小增加相同的数量吗? 这是在“静态分配”标题下使用该短语的页面之一。 返璞归真:内存分配,回顾历史

3
为什么两个相同的列表具有不同的内存占用量?
我创建了两个列表l1和l2,但是每个列表都有不同的创建方法: import sys l1 = [None] * 10 l2 = [None for _ in range(10)] print('Size of l1 =', sys.getsizeof(l1)) print('Size of l2 =', sys.getsizeof(l2)) 但是输出使我感到惊讶: Size of l1 = 144 Size of l2 = 192 使用列表推导创建的列表在内存中的容量更大,但是在Python中,这两个列表是相同的。 这是为什么?这是CPython内部的东西,还是其他解释?

9
我的变量存储在内存中的什么位置?
通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在主函数中),指针在哪里,并动态分配空间(使用malloc和calloc)存储在内存中? 我认为它们的分配如下: 全局变量------->数据 静态变量------->数据 常量数据类型----->代码 局部变量(在函数中声明和定义)-------->堆栈 在主函数----->堆中声明和定义的变量 指针(例如char *arr,int *arr)------->堆 动态分配的空间(使用malloc和calloc)-------->堆栈 我仅从C角度指这些变量。 如果我错了,请纠正我,因为我是C新手。

7
为什么要使用ivar?
我通常会以相反的方式问这个问题,例如,每个ivar都必须是一个属性吗?(而且我喜欢bbum对这个问题的回答)。 我几乎只在代码中使用属性。但是,我经常与一个承包商合作,该承包商已经在iOS上开发了很长时间,并且是传统的游戏程序员。他编写的代码几乎不声明任何属性,而是依靠ivars。我认为他这样做是因为1.)他习惯了,因为直到Objective C 2.0('Oct '07)和2.)才开始存在属性,以实现不通过getter / setter方法的最小性能提升。 尽管他编写的代码不会泄漏,但我仍然希望他使用属性而不是ivars。我们讨论了这个问题,由于我们没有使用KVO,他或多或少地认为没有理由使用属性,并且他在处理内存问题方面经验丰富。 我的问题是更多...为什么您要使用ivar期间-经验丰富与否。是否确实有很大的性能差异可以证明使用ivar是合理的? 同样,为了澄清起见,我根据需要覆盖了setter和getter,并使用了与getter / setter内部与该属性相关的ivar。但是,在getter / setter或init之外,我始终使用self.myProperty语法。 编辑1 我感谢所有的良好回应。我想解决的一个看起来不正确的问题是,使用ivar可以封装,而使用属性则不需要。只需在类延续中定义属性即可。这将使财产对外界隐藏。您还可以在接口中将属性声明为readonly,然后在实现中将其重新定义为readwrite,例如: // readonly for outsiders @property (nonatomic, copy, readonly) NSString * name; 并在课堂上继续学习: // readwrite within this file @property (nonatomic, copy) NSString * name; 要使其完全“私有”,只能在类继续中声明它。

10
iOS应用最大内存预算
我正在开发一款至少定位3gs的ios游戏。我们将高清资产用于视网膜显示设备(iphone 4,ipod touch 4th gen)。 在内存方面,Ipod Touch 4th gen似乎对我们来说是最受限制的设备,因为它具有与3gs相同的RAM(与Iphone 4的512相比,为256),但是我们使用的是HD资产。尝试加载100-110mb的ram时,该应用程序曾经崩溃过,但是现在我们的内存降到了70MB,我们再也没有加载过崩溃了。 经过大量搜索之后,似乎没有官方的硬限制,因此我们应该如何知道使用什么内存预算是安全的呢?我们希望能够给艺术家一个预算,使他们可以在没有记忆的情况下使用每张地图。

15
哪些策略和工具可用于发现.NET中的内存泄漏?
我写了10年的C ++。我遇到了内存问题,但是可以通过合理的努力解决它们。 在过去的几年中,我一直在编写C#。我发现我仍然遇到很多内存问题。由于不确定性,它们很难诊断和修复,并且因为C#的理念是,当您一定要这样做时,您不必担心这些事情。 我发现的一个特殊问题是,我必须明确地处置和清理代码中的所有内容。如果我不这样做,那么内存探查器并没有真正的帮助,因为有太多杂乱无章的东西浮在水面上,您无法在他们试图向您展示的所有数据中找到泄漏。我想知道我是否有错误的主意,或者我拥有的工具不是最好的。 什么样的策略和工具对于解决.NET中的内存泄漏很有用?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.