Tag: 管理

程序如何在内存中运行以及操作系统处理内存的方式

当进程在运行时执行时,我不清楚内存管理 这是一张图 我不清楚图像中的以下内容: 1)这个图像所指的堆栈是什么? 2)什么是内存映射段,它指的是文件映射? 3)堆与进程有什么关系。 堆只是在进程中处理还是由操作系统内核维护的堆,然后当用户空间应用程序调用时,malloc(使用堆)分配内存空间? 文章提到了http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 虚拟地址空间,在32位模式下始终是4GB的内存地址块。 这些虚拟地址按页表映射到物理内存, 4)这是否意味着一次只有一个程序在内存中运行占用整个4 GB的RAM? 同一篇文章也提到了 Linux通过向起始地址添加偏移量来随机化堆栈,内存映射段和堆。 不幸的是,32位地址空间非常紧张,几乎没有随机化空间并妨碍其有效性。 5)它是指在一个进程中随机化堆栈还是指在计算所有进程的空间后留下的东西?

C中的自定义内存分配器/管理器? 哪种方法?

我正在寻找用c编写的一些(自定义)内存管理器/分配器并经历了一些文章, – 一些链接: IBM – 内部内存管理 Valgrind – 如何影响程序使用的每个字节的内存 堆栈溢出问题 – 编写自己的内存管理器 ned Productions – nedmalloc主页 两级隔离适合(TLSF) – 网站 维基百科 – 动态内存分配 Fourmilab – BGET内存分配器 我必须使用任何可用的沙箱来沙箱一个小的Web服务器,我在编写线程处理/分配方案的包装器时没有问题。 Apache WS使用内存池来处理内存,并且池不是持久的,它是基于请求的。 你们能提出什么建议吗? 一些好/最好的方法来解决这个问题? 我的要求如下; – (有界响应时间)分配和解除分配必须事先知道,即一些常数成本O(c),其中c是常数。 应该处理来自异构分配/解除分配大小或序列的碎片,我可以编写模式/包装器来提供相同的碎片。 真的很感谢你的帮助和想法!

HashTable中的内存分配问题

请不要关闭这个说一个重复的问题 。 我做了一个重要的改变,所以不要混淆别人,我重新提交了这个更清晰的代码。 请帮我解决这个内存分配问题。 我正在研究一个HashTable,这就是我的(仅限部分代码) main.c中 HashTablePtr hash; hash = createHashTable(10); insert(hash, “hello”); insert(hash, “world”); HashTable.c HashTablePtr createHashTable(unsigned int capacity){ HashTablePtr hash; hash = (HashTablePtr) malloc(sizeof(HashTablePtr)); hash->size = 0; hash->capacity = capacity; hash->list = (ListPtr *)calloc(capacity, sizeof(List)); /*NO MEMORY ALLOCATION HERE*/ return hash; List.h typedef struct list List; typedef struct list * ListPtr; struct list […]

打印数组元素内存对应C和C ++,为什么输出不同?

可能重复: 使用std :: cout时如何模拟printf的%p格式? 我尝试用C和C ++打印出数组元素的内存地址。 在C: char array[10]; int i; for(i =0; i<10;i++){ printf(" %p \n", &array[i]); } 我得到了内存地址: 0xbfbe3314 , … 但是,如果我尝试在C ++中做同样的事情: char array[10]; for(int i =0; i<10;i++){ std::cout<<&array[i]<<std::endl; } 我得到了这个输出: P ķ 为什么会有所不同? 我应该在C ++中以不同方式使用cout来打印出内存地址吗? 我该如何打印出内存地址?

何时在C ++中从内存中删除变量?

我现在一直在使用C ++。 我只是不确定内存管理是如何工作的,所以在这里: 我首先不确定如何在函数中分配内存,例如: int addTwo(int num) { int temp = 2; num += temp; return num; } 所以在这个例子中,函数结束后是否会从内存中删除? 如果没有,这是怎么做到的。 在C#中,一旦变量用完,变量就会被删除。 还有其他我应该知道的案例吗? 谢谢

为什么我不应该对未由malloc()分配的变量调用free()?

我在某处读到使用free来摆脱一个不是通过调用malloc创建的对象是灾难性的,这是真的吗? 为什么?

当你尝试释放()已经释放c中的内存时会发生什么?

例如: char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); free(myString); free(myString); 这样做会有不良副作用吗?

结构的内存大小不同?

为什么第一种情况下不是12? 测试:最新版本的gcc和clang,64位Linux struct desc { int** parts; int nr; }; sizeof(desc); Output: 16 struct desc { int** parts; }; sizeof(desc); Output: 8 struct desc { int nr; }; sizeof(desc); Output: 4

使用Visual Studio确定堆栈空间

我在Visual Studio 2005中用C编程。我有一个multithreading程序,但这在这里并不是特别重要。 如何确定(大约)我的线程使用多少堆栈空间? 我计划使用的技术是将堆栈内存设置为某个预定值,比如0xDEADBEEF,运行程序很长时间,暂停程序,并调查堆栈。 如何使用Visual Studio读取和写入堆栈内存? 编辑:例如,参见“如何确定最大堆栈使用量”。 这个问题谈到了嵌入式系统,但在这里我试图在常规PC上确定答案。

我应该使用字符串文字来释放char *吗?

我应该在使用字符串文字初始化时释放char*变量吗? 对我来说,语法会让我假设它们只是堆栈分配,但这个例子告诉我,它们不是。 #include #include static char* globalBuffer; typedef struct Container { char* buffer; } Container; Container* Container_new(char* buffer) { Container* container = malloc(sizeof(Container)); container->buffer = buffer; globalBuffer = buffer; return container; } void Container_print(Container* container) { if (container->buffer != NULL) { printf(container->buffer); printf(“\n”); } else { printf(“Container contains a NULL-buffer.”); } } Container* stage() { […]