标签: memory-management

何时以及为什么操作系统会在malloc/free/new/delete上将内存初始化为0xCD,0xDD等?

我知道操作系统有时会使用某些模式(如0xCD和0xDD)初始化内存.我想知道的是何时以及为什么会发生这种情况.

什么时候

这是否特定于编译器使用?

对于这个,malloc/new和free/delete的工作方式是否相同?

它是特定于平台的吗?

它会出现在其他操作系统上,例如Linux或VxWorks吗?

为什么

我的理解是这只发生在Win32调试配置中,它用于检测内存溢出并帮助编译器捕获异常.

你能举一个关于这个初始化如何有用的实际例子吗?

我记得读过一些东西(可能在Code Complete 2中),在分配内存时将内存初始化为已知模式是好的,某些模式会触发Win32中的中断,这将导致调试器中出现异常.

这有多便携?

c c++ memory memory-management

120
推荐指数
3
解决办法
3万
查看次数

增加(或减少)R进程可用的内存

我想增加(或减少)R可用的内存量.实现此目的的方法有哪些?

memory-leaks memory-management r

115
推荐指数
6
解决办法
19万
查看次数

115
推荐指数
5
解决办法
8万
查看次数

在哪些情况下我们需要在ARC下编写__autoreleasing所有权限定符?

我正在努力完成这个难题.

__strong是所有Objective-C可保留对象指针的默认值,如NSObject,NSString等.这是一个强大的参考.ARC -release在范围的末尾与a平衡.

__unsafe_unretained等于旧的方式.它用于弱指针而不保留可保留对象.

__weak就像__unsafe_unretained不同之处在于它是一个自动归零弱引用这意味着该指针将零一旦引用的对象被释放被设置为.这消除了悬空指针和EXC_BAD_ACCESS错误的危险.

但到底有什么__autoreleasing好处呢?我很难找到关于何时需要使用此限定符的实际示例.我相信它只适用于期望指针指针的函数和方法,例如:

- (BOOL)save:(NSError**);
Run Code Online (Sandbox Code Playgroud)

要么

NSError *error = nil;
[database save:&error];
Run Code Online (Sandbox Code Playgroud)

在ARC下必须以这种方式声明:

- (BOOL)save:(NSError* __autoreleasing *);
Run Code Online (Sandbox Code Playgroud)

但这太模糊了,我想完全理解为什么.我找到的代码片段将__autoreleasing放在两颗星之间,这对我来说很奇怪.类型是NSError**(一个指针指向NSError),那么为什么要放在__autoreleasing星星之间而不是简单地放在前面NSError**呢?

此外,可能还有其他必须依赖的情况__autoreleasing.

memory-management objective-c ios automatic-ref-counting

114
推荐指数
3
解决办法
3万
查看次数

iOS5中强弱存储的说明

我是iOS5开发新手并使用objective-c.我无法理解存储和存储之间的区别.我已经阅读了文档和其他SO问题,但它们听起来与我完全相同,没有进一步的见解.

我阅读了文档:Transitioning To ARC - 它引用了iOS4的retain,assign和release条件; 这让我很困惑.然后我看看Open U CS193p,它区分强弱:

强者:"把它保持在堆中,直到我不再指向它为止"
:"只要别人强烈地指出它就保持这种状态"

是不是两个定义相同=如果指针不再指向一个对象,那么释放持有该对象的内存?我理解指针,堆,分配或释放内存的概念 - 但强弱之间有什么区别?

memory-management ios5 automatic-ref-counting

114
推荐指数
2
解决办法
5万
查看次数

聪明的指针:或谁拥有你的宝贝?

C++完全是关于内存所有权
Aka" Ownership Semantics "

一块动态分配的内存的所有者负责释放该内存.所以这个问题真的变成了拥有记忆的人.

在C++中,所有权都是由RAW指针包含在内部的类型记录的,因此在一个好的(IMO)C++程序中,很少见[RARE并非永远]看到RAW指针传递(因为RAW指针没有推断的所有权因此我们不能告诉谁拥有记忆,因此如果没有仔细阅读文件,你无法分辨谁负责所有权).

相反,很少看到RAW指针存储在类中,每个RAW指针都存储在自己的SMART指针包装器中.(注意:如果你没有一个对象,你不应该存储它,因为你不知道什么时候它会超出范围并被销毁.)

所以问题是:

  • 人们遇到什么类型的所有权语义?
  • 使用哪些标准类来实现这些语义?
  • 你认为它们在哪些情况下有用?

让我们为每个答案保留一种语义所有权,这样他们就可以单独上下投票

摘要:

从概念上讲,智能指针很简单,而且简单易用.我已经看过许多尝试过的实现,但总是以某种方式打破它们,这对于随意使用和示例来说并不明显.因此,我建议始终使用经过良好测试的"智能指针",而不是自己动手.std :: auto_ptr或其中一个提升智能指针似乎涵盖了我的所有需求.

的std :: auto_ptr的<T>:

单身人士拥有该物品.
但允许转让所有权.

用法:
======
这允许您定义显示所有权显式转移的接口.

升压:: scoped_ptr的<T>

单身人士拥有该物品.
不允许转让所有权.

用法:
======
用于显示明确的所有权.
对象将被析构函数或显式重置时销毁.

boost :: shared_ptr <T>(std :: tr1 :: shared_ptr <T>)

多个所有权.
这是一个简单的引用计数指针.当引用计数达到零时,对象被销毁.

用法:
======
当对象可以有多个owers,其生命周期无法在编译时确定.

升压::的weak_ptr <T>

与shared_ptr <T>一起使用.
在指针循环可能发生的情况下.

用法:
======
用于在仅循环维护共享引用计数时停止保留对象的周期.

c++ memory-management smart-pointers ownership-semantics

113
推荐指数
3
解决办法
5万
查看次数

C++,Free-Store vs Heap

new/delete据说动态分配在免费商店中进行,
malloc/free操作则使用.

在实践中,我想知道是否存在实际差异.
编译器是否区分了这两个术语?(免费商店,不new/malloc)

c++ memory-management

112
推荐指数
4
解决办法
5万
查看次数

UIPopovercontroller dealloc到达,而popover仍然可见

我向你保证,我确实在我的问题中寻找答案,但没有一个是有帮助的.在这里,我得到了一个简单的代码,它应该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];
}
Run Code Online (Sandbox Code Playgroud)

现在,即使从我第一次[UIPopoveController dealloc]到达时...错误和程序崩溃.根据ARC,我没有做任何保留,重新发布或自动释放.UIPopoverControllers当受益于ARC时,有什么特别的考虑吗?

memory-management uipopovercontroller ios automatic-ref-counting

111
推荐指数
3
解决办法
3万
查看次数

Android Studio - 如何增加分配的堆大小

我已经使用Android Studio 3个月了,我开始使用的其中一个应用程序变得相当大.程序右下方显示的内存使用情况表明我分配的堆最大值为494M.

在此输入图像描述

当我开始更改XML文件时,我的内存使用量很快达到上限,并且IDE崩溃时出现Out Of Memory错误.

在此输入图像描述

我试图用这个增加堆大小,但到目前为止没有任何影响.

我已经看了几十篇关于如何增加堆大小的文章和其他问题,但他们的答案都没有奏效.无论我对VMOPTIONS或IDE设置做什么,堆大小都不会增加.我相信我正在为VMOPTIONS编辑正确的文件,因为如果我故意给它一个无效的命令Android Studio抱怨它并且不启动.

我正在使用Windows 7 - 64位并拥有16GB RAM.Android Studio有没有其他人遇到此问题?你能解决它吗?

crash android memory-management out-of-memory android-studio

111
推荐指数
14
解决办法
18万
查看次数

java中的静态分配 - 堆,堆栈和永久生成

我最近一直在阅读java中的内存分配方案,并且由于我从各种来源阅读,因此有很多疑问.我已经收集了我的概念,并且我会要求完成所有要点并对它们进行评论.我开始知道内存分配是特定于JVM的,所以我必须事先说,我的问题是Sun特定的.

  1. 类(由类加载器加载)进入堆上的特殊区域:永久生成
  2. 与类名称,与类关联的对象数组,JVM使用的内部对象(如java/lang/Object)和优化信息等类相关的所有信息都会进入永久生成区域.
  3. 所有静态成员变量再次保留在"永久生成"区域中.
  4. 物体在不同的堆上:年轻一代
  5. 每个类只有一个方法的副本,无论是静态还是非静态方法.该副本放在永久生成区域.对于非静态方法,所有参数和局部变量都进入堆栈 - 只要对该方法进行具体调用,我们就会得到一个与之关联的新堆栈帧.我不确定静态方法的局部变量存储在哪里.他们是永久世代的堆吗?或者只是他们的引用存储在Permanent Generation区域,而实际的副本是在其他地方(Where?)
  6. 我也不确定方法的返回类型存储在何处.
  7. 如果对象(在年轻代中)需要使用静态成员(在永久生成中),则为它们提供对静态成员的引用&&它们被给予足够的存储空间来存储方法的返回类型等.

谢谢你经历这个!

java static memory-management permanent-generation

110
推荐指数
1
解决办法
6万
查看次数