标签: malloc

malloc()/ free()的对齐限制

较旧的K&R(第二版)和其他我读过的C语言文本讨论了动态内存分配器的实现方式,malloc()并且free()通常还提及有关数据类型对齐限制的内容.显然,某些计算机硬件体系结构(CPU,寄存器和内存访问)限制了如何存储和处理某些值类型.例如,可能要求long必须从4的倍数地址开始存储4字节()整数.

主要平台(英特尔和AMD,SPARC,Alpha)对内存分配和内存访问有什么限制(如果有的话),还是可以安全地忽略在特定地址边界上对齐内存分配?

c memory malloc allocation

8
推荐指数
2
解决办法
4752
查看次数

tcmalloc:如何在静态编译时覆盖我的malloc调用?

当我使用时LD_PRELOAD=/usr/local/lib/libtcmalloc.so,我对malloc的所有调用都变成了tcmalloc调用.但是,当我静静地链接到libtcmalloc时,我发现直接malloc被调用,除非我仍然使用该LD_PRELOAD设置.

那么我怎么能以这样的方式静态编译tcmalloc,使我的mallocs挂钩到tcmalloc?

笔记:

  • 我正在使用大量的C++ new等,所以只有#defining malloc to tcmalloc才行
  • 可能我必须自己使用malloc_hook,但我想我可以得到tcmalloc来为我做,因为它显然在动态链接时这样做

c++ malloc linker tcmalloc

8
推荐指数
1
解决办法
6670
查看次数

sYSMALLOc:断言失败 - 任何想法如何有效调试?

我的服务器守护程序在大多数机器上工作正常,但是我得到的是:

malloc.c:3074: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1)
 - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||
 ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct 
malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 
1)))&& ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Run Code Online (Sandbox Code Playgroud)

gdb回溯:

#4  0x002a8300 in sYSMALLOc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:3071
#5  _int_malloc (av=<value optimised out>, bytes=<value optimised out>) at malloc.c:4702
#6  0x002a9898 in …
Run Code Online (Sandbox Code Playgroud)

c debugging malloc gdb

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

当使用malloc而不是new时,类成员会发生什么?

我正在读期末考试,我偶然发现了一个奇怪的问题,这是我们老师去年给一些可怜的灵魂所做的考试的一部分.问题是这样的:

以下程序是否正确?如果是,请记下程序输出的内容.如果不是,请写下原因.

该程序:

#include<iostream.h>
class cls
{     int x;
      public: cls() { x=23; }
      int get_x(){ return x; } };
int main()
{     cls *p1, *p2;
      p1=new cls;
      p2=(cls*)malloc(sizeof(cls));
      int x=p1->get_x()+p2->get_x();
      cout<<x;
      return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的第一直觉是回答"程序不正确,new应该用来代替malloc".但是,在编译程序并查看输出后,23我意识到答案可能不正确.

问题是我期望p2->get_x()返回一些任意数字(无论发生什么事情都在malloc被调用的内存中).然而,它返回0.我不确定这是巧合还是类成员在malloc-ed 时被初始化为0 .

  • 这种行为(p2->x在0之后malloc)是默认的吗?我应该预料到这一点吗?
  • 什么会你的答案,我的老师的问题是什么?(除了忘记#include <stdlib.h>malloc:P)

c++ malloc memory-management

8
推荐指数
1
解决办法
8296
查看次数

在C99 +中结合使用指定的初始化程序和malloc?

有没有一种很好的方法来组合来自C99的指定初始化器,结果是malloc

以下似乎有不必要的重复:

typedef struct {
   int a, b, c;
} Type;

Type *t = malloc(sizeof *t);
*t = (Type) {
    .a = 2,
    .b = 3,
    .c = 5,
};
Run Code Online (Sandbox Code Playgroud)

可以使用Type,并*t从上面的代码中删除?

c malloc c99 designated-initializer

8
推荐指数
1
解决办法
1171
查看次数

为什么malloc(sizeof(指针))有效?

以下代码工作正常:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    struct node{
        int a, b, c, d, e;
    };
    struct node *ptr = NULL;
    printf("Size of pointer ptr is %lu bytes\n",sizeof (ptr));
    printf("Size of struct node is %lu bytes\n",sizeof (struct node));
    ptr = (struct node*)malloc(sizeof (ptr));               //Line 1
//    ptr = (struct node*)malloc(sizeof (struct node));    //Line 2

    ptr->a = 1; ptr->b = 2; ptr->c = 3; ptr->d = 4; ptr->e = 5;
    printf("a: %d, b: %d, c: %d, d: %d, e: %d\n", …
Run Code Online (Sandbox Code Playgroud)

c malloc gcc pointers

8
推荐指数
2
解决办法
5217
查看次数

为什么malloc(0)在"Inside the C++ Object Model?"中有用?

在"内部C++对象模型"一书的第6.3节中,临时对象(第230页):

实际结果取决于实现依赖于底层删除操作符实际释放所寻址的内存的积极程度.某些实现虽然将内存标记为空闲,但实际上并未以任何方式对其进行更改.在内存被其他内容声明之前,可以使用它,就像它没有被删除一样.虽然显然不是软件工程的示例性方法,但是在释放它之后访问内存的这种习惯并不罕见. 事实上,许多实现malloc()提供了一种特殊的调用malloc(0);来保证这种行为.

根据以上所述,malloc(0)似乎与访问已经被释放的存储器(但其内容未被改变)有关.

我的问题是如何malloc(0)保证这种行为?

c++ memory malloc

8
推荐指数
1
解决办法
522
查看次数

mmap或malloc是否分配RAM?

我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,但无法找到明确的答案.如果我使用mmapmalloc(在C中,在Linux机器上)任何一个在RAM中分配空间?例如,如果我有2GB的RAM并且想要使用所有可用的RAM,我可以使用malloc/memset组合mmap,或者是否有另一种我不知道的选项?

我想编写一系列可以同时运行的简单程序,并保持进程中使用的所有RAM强制使用交换,并且频繁地交换页面.我已经尝试过以下程序,但这并不是我想要的.它确实分配内存(RAM?),并强制使用交换(如果有足够的实例正在运行),但是当我调用时sleep不会只是锁定内存被使用(因此实际上没有任何内容与其他内容进行交换)过程?),或者我误解了什么.

例如,如果我运行了3次,那么我将使用前两个实例中的2GB(全部)RAM,然后第三个实例会将前两个实例中的一个(RAM)和当前实例交换到RAM中吗?或者实例#3是否只使用磁盘或虚拟内存运行?

这提出了另一点,我是否需要分配足够的内存来使用所有可用的虚拟内存以及要使用的交换分区?

最后,将mmap(或任何其他C函数.地狱,甚至是另一种语言,如果适用)更好地做到这一点?

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

#define MB(size) ( (size) * 1024 * 1024)
#define GB(size) ( (size) * 1024 * 1024 * 1024)


int main(){
    char *p;
    p = (char *)malloc(MB(512));
    memset(p, 'T', MB(512));
    printf(".5 GB allocated...\n");

    char *q;
    q = (char *)malloc(MB(512));
    memset(q, 'T', MB(512));
    printf("1 GB allocated...\n");
    printf("Sleeping...\n");

    sleep(300);
}
Run Code Online (Sandbox Code Playgroud)

**编辑:我正在为我的操作系统使用CentOS 6.4(带有3.6.0内核),如果这有帮助的话.

c linux memory malloc mmap

8
推荐指数
2
解决办法
7095
查看次数

malloc结构中的数组

我正在尝试malloc在结构中的数组,但我运行程序时不断收到分段错误.

这个compares功能只是我正在测试的东西,所以它不应该成为问题的一部分

typedef struct {
    char *string;
} prod_t;

int
main(int agrc, char **argv){
    int i = 0;
    prod_t *c = NULL;

    char str2[100] = "abcd";
    c->string = (char *) malloc( 5 * sizeof(char));
    strcpy(c->string,str2);

    compares(c->stock,str2,i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays malloc struct

8
推荐指数
2
解决办法
7959
查看次数

C中的双星号和`malloc`

我已经学习了一段时间的指针,我似乎无法完全绕过它.当您从解释指向实际函数的指南和假设您了解它们的代码跳转时,似乎存在一个无法解释的差距.令我烦恼的代码如下:

char **output_str = malloc(sizeof(char*));
Run Code Online (Sandbox Code Playgroud)

好的,所以我的理解如下,

**output_str is a character
*output_str is a pointer to a character
output_str is a pointer to a pointer to a character
Run Code Online (Sandbox Code Playgroud)

据我所知,malloc()返回一个指向刚刚分配的内存开头的指针,该指针的大小值等于指向字符(char*)的指针的大小.现在,不应该指向内存开始的指针有一个*?如果是这样,我们怎样才能为*分配*?我很困惑,如果有人能提供一些澄清,并且可能对内存部分有一些了解,那将非常好.

c malloc types pointers

8
推荐指数
1
解决办法
700
查看次数