Questions tagged «memory-management»

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

7
C ++,免费存储与堆
new/delete据说动态分配是在免费存储上进行的,而malloc/free操作则使用堆。 在实践中,我想知道是否存在实际差异。 编译器是否区分这两个术语?(免费存储和堆,不是new/malloc)


10
在C ++中正确使用堆栈和堆?
我已经编程了一段时间了,但主要是Java和C#。我从来没有真正需要自己管理内存。我最近开始用C ++进行编程,对于何时将内容存储在堆栈上以及何时将它们存储在堆上,我有些困惑。 我的理解是,经常访问的变量应该存储在堆栈和对象中,很少使用的变量以及大型数据结构都应该存储在堆中。这是正确的还是我不正确的?

22
Android Studio-如何增加分配的堆大小
我使用Android Studio已有3个月了,而我开始使用它的应用程序已经变得相当庞大。程序右下角指示的内存使用量表示我分配的堆最大为494M。 当我开始更改XML文件时,我的内存使用量很快达到该上限,并且IDE崩溃,并显示如下内存不足错误。 我尝试使用此方法来增加堆大小,但到目前为止没有任何效果。 我看了很多关于如何增加堆大小的文章和其他问题,但是他们的答案都没有用。无论我对VMOPTIONS或IDE设置做什么,堆大小都不会增加。我相信我正在为VMOPTIONS编辑正确的文件,因为如果我故意给它一个无效的命令,Android Studio会抱怨它并且无法启动。 我正在使用Windows 7-64位并具有16GB RAM。还有其他人在Android Studio中遇到此问题吗?并且您能够修复它?

3
在哪种情况下,我们需要在ARC下编写__autoreleasing所有权限定符?
我正在努力完成难题。 __strong是所有Objective-C可保留对象指针(如NSObject,NSString等)的默认值。这是一个强大的参考。ARC -release在范围的末尾与a 保持平衡。 __unsafe_unretained等于旧方法。它用于弱指针而不保留可保留对象。 __weak__unsafe_unretained与之类似,只是它是一个自动归零的弱引用,这意味着一旦释放引用的对象,指针将设置为nil。这消除了悬挂指针和EXC_BAD_ACCESS错误的危险。 但是究竟有什么__autoreleasing好处呢?我很难找到有关何时需要使用此限定符的实际示例。我相信这仅适用于期望指针指向的函数和方法,例如: - (BOOL)save:(NSError**); 要么 NSError *error = nil; [database save:&error]; 在ARC下必须这样声明: - (BOOL)save:(NSError* __autoreleasing *); 但这太模糊了,我想完全理解为什么。我发现的代码片段将__autoreleasing放在两颗星之间,这对我来说很奇怪。类型是NSError**(指向NSError的指针),那么为什么要放置__autoreleasing在星星之间而不是简单地放置在它们之间NSError**? 另外,可能还有其他情况我必须依靠__autoreleasing。

1
Java中的静态分配-堆,堆栈和永久生成
最近,我一直在阅读有关Java中的内存分配方案的大量文章,并且由于我从各种来源中进行了阅读,所以存在很多疑问。我已经收集了我的概念,并要求仔细阅读所有要点并对其进行评论。我知道内存分配是特定于JVM的,因此我必须事先说一下,我的问题是特定于Sun的。 类(由类加载器加载)放在堆上的特殊区域中:永久生成 与类有关的所有信息,例如类的名称,与该类关联的对象数组,JVM使用的内部对象(例如java / lang / Object)以及优化信息,都进入“永久生成”区域。 所有静态成员变量将再次保留在永久生成区域中。 对象放在不同的堆上:年轻的一代 每个类每个方法只有一个副本,该副本是静态的还是非静态的。该副本将放置在“永久生成”区域中。对于非静态方法,所有参数和局部变量都进入堆栈-每当对该方法进行具体调用时,我们都会获得一个与之关联的新堆栈框架。我不确定静态方法的局部变量存储在哪里。他们在永久一代的堆上吗?或者只是它们的引用存储在“永久生成”区域中,而实际副本位于其他位置(在哪里?) 我也不确定方法的返回类型存储在哪里。 如果对象(年轻一代)需要使用静态成员(永久一代),则为它们提供对静态成员的引用&&为它们提供足够的存储空间以存储方法的返回类型等。 谢谢你的经历!

6
iOS5中强弱存储的说明
我是iOS5开发的新手,正在使用Objective-C。我很难理解强存储和弱存储之间的区别。我已经阅读了文档和其他SO问题,但是它们听起来与我完全相同,没有进一步的了解。 我阅读了以下文档:过渡到ARC-引用了iOS4的保留,分配和发布条款;这让我感到困惑。然后,我看一下Open U CS193p,它区分强项和弱项: 强:“将其保留在堆中,直到我不再指向它为止” 弱:“只要其他人强烈将其保留,则保留此” 这两个定义是否相同=如果指针不再指向对象,则释放保存该对象的内存?我了解指针,内存堆,分配或释放的概念-但是强和弱之间有什么区别?

11
智能指针:谁拥有对象?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊不清,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 8年前关闭。 C ++全部关于内存所有权(也称为所有权语义)。 动态分配的内存块的所有者负责释放该内存。因此,问题实际上变成了谁拥有记忆。 在C ++所有权中,原始指针被包装在其中,因此在一个良好的(IMO)C ++程序中,很少会看到原始指针传递(很少,不是永远不会)(因为原始指针没有推断出的所有权,因此我们可以不知道谁是内存的所有者,因此,如果不仔细阅读文档,就无法知道谁对内存负责。 相反,很少看到原始指针存储在类中,每个原始指针都存储在其自己的智能指针包装器中。(注意:如果您不拥有对象,则不应存储该对象,因为您不知道该对象何时会超出范围并被破坏。) 所以问题是: 人们遇到过哪种所有权语义? 哪些标准类用于实现这些语义? 您觉得它们在什么情况下有用? 让我们为每个答案保留一种类型的语义所有权,以便可以分别对它们进行表决。 摘要: 从概念上讲,智能指针很简单,简单的实现也很容易。我已经看到了许多尝试的实现,但是它们总是以某种偶然使用和示例不明显的方式被破坏。因此,我建议始终使用库中经过良好测试的智能指针,而不要自己动手。std::auto_ptr或Boost智能指针之一似乎可以满足我的所有需求。 std::auto_ptr<T>: 一个人拥有该对象。允许转让所有权。 用法:这允许您定义显示显式所有权转移的接口。 boost::scoped_ptr<T> 一个人拥有该对象。不允许转让所有权。 用法:用于显示明确的所有权。对象将由析构函数或明确重置后销毁。 boost::shared_ptr<T>(std::tr1::shared_ptr<T>) 多重所有权。这是一个简单的引用计数指针。当引用计数达到零时,对象将被销毁。 用法:一个对象可以具有多个编译器,且其生存期在编译时无法确定。 boost::weak_ptr<T>: 用于shared_ptr<T>可能发生指针循环的情况。 用法:仅当循环维护共享引用计数时,用于停止保留对象的循环。

6
有没有办法从解释器的内存中删除创建的变量,函数等?
我一直在寻找这个问题的准确答案已有几天了,但是还没有任何好的结果。我不是编程的完整初学者,但即使在中级水平上也还不是。 当我进入Python的外壳程序时,键入:dir()并且可以看到当前作用域(主块)中所有对象的所有名称,其中有6个: ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__'] 然后,例如,当我声明一个变量时,x = 10它会自动添加到内置模块下的对象列表中dir(),当我dir()再次键入时,它现在显示: ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x'] 函数,类等也是如此。 我如何删除所有这些新对象而不删除开始时可用的标准6? 我在这里已经阅读了有关“内存清理”,“控制台清理”的信息,该命令将删除命令提示符窗口中的所有文本: >>> import sys >>> clear = lambda: os.system('cls') >>> clear() 但是,所有这些都与我要实现的目标无关,它不会清除所有使用过的对象。

10
free(ptr)其中ptr为NULL会损坏内存吗?
理论上我可以说 free(ptr); free(ptr); 这是内存损坏,因为我们要释放已经释放的内存。 但是如果 free(ptr); ptr=NULL; free(ptr); 由于操作系统将以不确定的方式运行,因此我无法对此进行实际的理论分析。无论我在做什么,这是不是内存损坏? 释放NULL指针是否有效?

3
在弹出窗口仍然可见的情况下达到了UIPopovercontroller的dealloc
我向你保证,我确实在为我的问题寻找答案,但是没有一个是有帮助的。在这里,我得到了一个简单的代码,应UIImagePickerController在内显示UIPopoverController: -(void)takePicture:(id)sender{ UIImagePickerController *picker=[[UIImagePickerController alloc] init]; picker.delegate=self; picker.sourceType=UIImagePickerControllerSourceTypeCamera; picker.allowsEditing=YES; UIPopoverController *poc=[[UIPopoverController alloc] initWithContentViewController:picker]; [poc presentPopoverFromBarButtonItem:bbItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO]; } 现在,即使是第一次[UIPopoveController dealloc]接触……错误,程序也会崩溃。根据ARC,我没有进行任何保留,释放或自动释放。UIPopoverControllers受益于ARC时是否需要特别考虑?

4
挥发物贵吗?
在阅读了有关volatile的实现的JSR-133编译器厨师手册之后,尤其是“与原子指令的交互”部分,我认为读取volatile变量而不更新它需要LoadLoad或LoadStore屏障。在页面的下方,我看到在X86 CPU上,LoadLoad和LoadStore实际上是无操作的。这是否意味着无需在x86上显式地使缓存无效就可以进行volatile读操作,并且它与普通变量读取一样快(不考虑volatile的重新排序约束)? 我相信我无法正确理解。有人可以启发我吗? 编辑:我想知道在多处理器环境中是否存在差异。如John V.所述,在单CPU系统上,CPU可能会查看其自己的线程缓存,但是在多CPU系统上,必须为CPU提供一些配置选项,这还不够,必须命中主内存,从而使volatile速度变慢在多CP​​U系统上,对吗? PS:在学习更多相关信息的过程中,我偶然发现了以下精彩文章,由于这个问题可能会让其他人感兴趣,因此我将在这里分享我的链接: Java理论与实践:修复Java内存模型,第1部分和 Java理论与实践:修复Java内存模型,第2部分



11
如何获取Android中的当前内存使用情况?
我已经使用了/ proc / meminfo并解析了命令response。但是结果表明: 内存总计:94348 kB内存空闲:5784 kB 手段。它显示只有5MB的可用内存。Android Mobile可能吗?我的手机上仅安装了5-6个应用程序,没有其他任务在运行。但是此命令仍然显示可用内存很少。 有人可以澄清吗?还是有任何其他方式来获取android中的内存使用情况?

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.