标签: memory-management

内存地址是否指向一个字节的信息?

以下是DTS文件的摘录.LINUX /拱/的PowerPC /引导/ DTS/[board_name] .dts

memory {
    device_type = "memory";
    reg = <0x00000000 0x40000000>;  // 1GB at 0
};
Run Code Online (Sandbox Code Playgroud)

嵌入式设备有1 GB的内存.

0x40000000 = 1073741824(十进制).

我得到1 GB的唯一方法是当我计算1073741824作为字节.

这意味着1073741824字节= 1GB.

这是否意味着0x00000000指向RAM中的一个字节数据?换句话说,RAM中的每个字节都有一个地址.

为什么会这样?我们读了8位块?为什么不说一句话?

ram memory-management linux-kernel embedded-linux device-tree

0
推荐指数
1
解决办法
1606
查看次数

[CustomViewController respondsToSelector:]:发送到解除分配的实例的消息

这用于我的预ARC代码工作正常,但由于重构所有项目是ARC兼容,我开始得到这个崩溃:

[CustomViewController respondsToSelector:]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)

我的项目是一个具有拆分视图的iPad应用程序,但与苹果文档相反,之前的开发人员已经在拆分视图之前在应用程序启动时显示另一个视图控制器.所以我知道这不是正确的方法,但正如我所说它在ARC集成之前曾经工作过,所以我需要解决这个问题.

根视图控制器包含项目菜单,每个项目显示要填充的详细信息表单,然后单击下一个按钮移动到下一个详细信息屏幕,等等.

当我点击根视图上的主页按钮返回主视图时,问题就开始了,这是将用户移动到主屏幕的相关代码:

//this method is in the appdelegate, and it gets called when clikc on home button located on the root view
- (void) showHome
{
    homeController.delegate = self;

    self.window.rootViewController = homeController;
    [self.window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)

然后,当我单击按钮返回拆分视图(根/详细信息视图的位置)时,应用程序将崩溃并显示上述说明.我用应用程序分析了应用程序,并且负责的代码行位于RootViewControllerdidSelectRowAtIndexPath方法中,这里是相关的代码:

    if(indexPath.row == MenuCustomViewController){
            self.customVC=[[CustomViewController alloc] initWithNibName:@"CustomVC"
                                                                      bundle:nil];
            [viewControllerArray addObject:self.customVC];
            self.appDelegate.splitViewController.delegate = self.customVC;
}
Run Code Online (Sandbox Code Playgroud)

customVC是一个强大的属性,我试图直接分配并分配给实例变量,但这没有帮助修复崩溃.有什么想法吗 ?

编辑: 这是由仪器给出的堆栈跟踪:

[self.appDelegate.splitViewController setViewControllers:viewControllerArray];//this line caused the crash

[viewControllerArray addObject:self.appDescVC];//this statement is called before the …
Run Code Online (Sandbox Code Playgroud)

memory-management uisplitviewcontroller ios automatic-ref-counting

0
推荐指数
1
解决办法
5943
查看次数

为指针赋值是否会破坏分配的内存?

我的问题对某些人来说似乎微不足道,但我不明白为什么这段代码:

double * a = new double [3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

a = 0;

for(int i=0; i<3;i++)
cout << " a[" << i << "] = " << a[i] << endl;

delete [] a ; 
Run Code Online (Sandbox Code Playgroud)

没有给出以下结果:

a[0] = 0;
a[1] = 0;
a[2] = 0;
Run Code Online (Sandbox Code Playgroud)

c++ pointers memory-management

0
推荐指数
1
解决办法
147
查看次数

malloc如何区分占用相同空间的不同类型?

假设在x86_64系统上运行以下程序:

int main() {
    //sizeof(int) == 4
    //sizeof(int*) == 8
    //sizeof(long) == 8

    // I would like 2 distinct memory locations to hold these two integers
    int* mem1 = (int*)malloc(2 * sizeof(int));
    mem1[0] = 1;
    mem1[1] = 2;

    //I would like 1 distinct memory location to hold this one long
    long* mem2 = (long*)malloc(1 * sizeof(long));
    mem2[0] = 3;

    free(mem1);
    free(mem2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于malloc接收要分配的字节数,因此对malloc的两次调用看起来完全相同.malloc如何知道实际分配16个字节来存储两个整数数组并且只为一个长度分配8个字节?

为清晰起见进行编辑:基于以下假设,存储这两个不同的阵列将需要为每个阵列提供不同的空间量.但是,malloc似乎每次在此程序中保留相同的空间量.然而,对于长度不同于longs 的数据类型的数组,正确地确定了数组大小.

有人可以帮我识别内存的这种理解中的缺陷,还是指出malloc/libc在后台做的事情?以下是我正在进行的假设

  • 在该系统的每个存储器地址中,最多可存储一个长度
  • mem[idx]指MEM的地址加上IDX的偏移量,并在存储器中该地址不能指向数据中的另一个项目的中间(因此mem1[0]不能参考的下半字mem1mem1[1] …

c malloc memory-management

0
推荐指数
1
解决办法
161
查看次数

如何初始化大尺寸的1000000x1000000的二维阵列?

我正在使用g ++编译器在ubuntu中开发一个cpp项目,我需要创建一个大小为1000000x1000000 = 10 ^ 12个元素的矩阵,其条目是布尔变量.但是我的g ++编译器允许我将空间分配给大约1000x1000个元素.如何克服这个巨大的矩阵分配空间的问题?

c++ linux gcc memory-management multidimensional-array

0
推荐指数
1
解决办法
1498
查看次数

C简单列表在for循环中添加元素不会工作,手动它可以工作

这有效:

struct list
{
    int value;
    struct list *next;
};

void addElement(struct list **l, int value)
{
    if( *l == 0 )
    {
        *l = (struct list *) malloc(sizeof(struct list));
        (*l)->value = value;
        (*l)->next = 0;
    }
    else
    {
        struct list *new_element = (struct list *) malloc(sizeof(struct list));
        new_element->value = value;
        new_element->next = *l;
        *l = new_element;
    }
}

void printList(struct list *l)
{
    struct list *temp;
    for(temp = l;temp; temp = temp->next)
    printf("%d ->", temp->value);
    printf("%d",0);
}

int main(int …
Run Code Online (Sandbox Code Playgroud)

c memory-management list data-structures

0
推荐指数
1
解决办法
210
查看次数

C++使用delete []删除指针?

以下是C++中的示例代码:

Foo *ptr;
ptr = new Foo;
delete [] ptr;
Run Code Online (Sandbox Code Playgroud)

这会遇到问题吗?什么应该是删除这样的指针和释放内存的正确方法?

谢谢

c++ memory-management

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

C/C++ malloc /免费.使用一个指针进行多次分配 - 糟糕的主意?

抱歉,如果这是一个愚蠢的问题 - 我一直在自学C++,我现在正在为自己编写一个内存管理器,但是我不清楚当我调用malloc和free时会发生什么.我在下面提供了一些骨架代码,希望能更好地说明我的问题.

我已经覆盖全局new和delete运算符来调用MemoryManager类的Alloc(size_t)和Free(void*)方法,并设置了一些工作得很好的内存池.但是,我允许其中一个池在需要时生长.通过将一些堆内存分配给指针来初始化此池:char*mPoolAllocator.

我的问题基本上是:当我扩展我的池时,使用相同的指针(mPoolAllocator)分配一些新的堆内存是否安全?当我在下面的~MemoryManager()中调用free(mPoolAllocator)时会发生什么?默认的内存管理器是否跟踪我使用此指针分配的堆内存的每一位,并允许我在一次调用中将它们全部释放为free,或者它是否只是从指针最后设置的地址开始释放块至?

下面的代码只是一个例子,并且远不及我的MemoryManager类如何工作:我主要是寻找有关malloc()和free()的反馈.

.................................................. .................................................. .................................................. ...............类MemoryManager

class MemoryManager
{
    public:
        MemoryManager();
        ~MemoryManager();

        void* Alloc(size_t size);
        void Free(void* address);

    private:
        size_t  mFreeMemory;                // unallocated memory left
        char*   mPoolAllocator,             // used to alloc memory from the heap
            *   mUnallocated;               // points to front of free blocks linked list

        void    ExtendPool();               // extends pool, increasing available memory

        void*   GetBlock(size_t size);      // returns heap address sufficient for and object of size
}
Run Code Online (Sandbox Code Playgroud)

.

void* MemoryManager::Alloc(size_t size)
{
    /* If there …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management

0
推荐指数
1
解决办法
459
查看次数

当没有dealloc方法时,我应该自动释放保留的属性/实例变量吗?

我正在学习内存管理一段时间.阅读Apple的内存管理指南以及其他作者的书籍/博客/论文/帖子.

令我困惑的是我是否应该写:

nameOfMySynthesizedProperty = [[NSObject alloc] init]; // version 1
Run Code Online (Sandbox Code Playgroud)

要么

nameOfMySynthesizedProperty = [[[NSObject alloc] init] autorelease]; // version 2
Run Code Online (Sandbox Code Playgroud)

在示例项目中,使用手动内存管理,没有dealloc方法,版本1用于所有类属性/ ivars.有时一些属性甚至没有合成但是它的吸气剂被使用,

这些都没有在我读过的教程/指南中讲授,但是这个示例项目顺利进行而没有崩溃......

任何人都可以给我一些亮点......

更新1

示例项目中使用手动内存管理.

更新2

另一个例子

AppDelegate.h

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
}
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) UIViewController *viewController;
@end
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // To be inserted with the following choices of code
}
@end
Run Code Online (Sandbox Code Playgroud)

AppDelegate.m- > -(BOOL)application:application didFinishLaunchingWithOptions:方法中,以下哪个对于初始化是正确的self.window.rootViewController …

memory-management objective-c

0
推荐指数
1
解决办法
1229
查看次数

收到内存警告和应用程序崩溃 - iphone

我正在使用ARC创建一个应用程序,但由于收到内存警告我的应用程序崩溃了.该应用程序在模拟器中工作正常.但是对于iphone设备,如果我运行应用程序几分钟,然后做任何事情,应用程序直接崩溃.我已经通过xcode仪器检查了我的应用程序.我的应用程序文件夹大小为6 MB,但所有内存分配在xcode仪器上显示为63 MB.

由于这个原因,presentViewController-Animated-Completion在导航过程中变慢.有没有人有任何解决方案为什么会发生这种情况?

在此输入图像描述

memory memory-management didreceivememorywarning ios

0
推荐指数
1
解决办法
2万
查看次数