标签: malloc

如何获取使用malloc()分配的内存块的大小?

可能重复:
如何从C中的指针获取数组的大小?
有没有办法以编程方式确定C++数组的大小?如果没有,为什么?

我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.

是否有什么比通过盲目地越过边界而挑起异常更优雅?

提前谢谢,安德烈亚斯

编辑:

我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3

EDIT2:

_msize在VC++ 2005下不幸的是它在调试模式下导致异常....

EDIT3:

好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.

它只是不优雅,绝不可用于生产代码.

c c++ malloc memory-management

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

驯服malloc /免费野兽 - 提示和技巧

我一直在一些项目上使用C获得硕士学位,但从未使用它构建生产软件.(.NET和Javascript是我的面包和黄油.)显然,需要free()记忆你malloc()在C中是至关重要的.如果你能在一个例行程序中做到这两件事,这很好,很好.但是随着程序的发展和结构的深入,跟踪什么是malloc"适合自由的地方和哪些内容"变得越来越难.

我查看了互联网,只找到了一些通用的建议.我怀疑的是,你们中的一些长期C编码员已经提出了自己的模式和实践来简化这个过程并将邪恶置于你面前.

那么:您如何建议构建C程序以防止动态分配成为内存泄漏?

c malloc free

11
推荐指数
2
解决办法
1571
查看次数

malloc如何运作?

可能重复:
free和malloc如何在C中工作?

考虑一种情况,我必须通过malloc分配大约20个字节的内存.对于malloc()的函数调用是否成功,20个字节是否应该在内存中连续可用或者是否可以分散?例如,在上面的例子中,如果有4个或5个块,每个10个字节,malloc会工作吗?或者这是特定于操作系统还是特定于编译器?

c malloc

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

realloc实际上是否会缩减常见实现中的缓冲区?

在常见的实现中,例如Linux/Glibc,Windows/MSVC和BSD/Mac OS X,将会

void *p = malloc(N + M);  // assume this doesn't fail
p = realloc(p, N);        // nor this
Run Code Online (Sandbox Code Playgroud)

N,M > 0实际上收缩返回的缓冲区mallocrealloc调用,在这个意义上,高达M字节可以返回到空闲列表?更重要的是,它是否有可能重新分配缓冲区?

我想知道,因为我刚刚在上面实现了动态数组numpy.ndarray,而我正在做一个resize调用realloc,以获得最终的大小.我可以跳过决赛resize作为优化(以牺牲永久性分配为代价),我想知道这是否值得尝试.

c python malloc memory-management numpy

11
推荐指数
1
解决办法
667
查看次数

malloc对内存对齐有哪些保证?

我遇到了以下代码:

int main()
{
    char *A=(char *)malloc(20);
    char *B=(char *)malloc(10);
    char *C=(char *)malloc(10);
    printf("\n%d",A);
    printf("\t%d",B);
    printf("\t%d\n",C);
    return 0;
}  
//output--   152928264     152928288    152928304
Run Code Online (Sandbox Code Playgroud)

我想知道如何完成分配和填充malloc().查看输出我可以看到起始地址是8的倍数.还有其他规则吗?

c malloc memory-management

11
推荐指数
3
解决办法
7477
查看次数

如何释放函数返回的指针?

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

char* f(void) {
  char *x;
  x = malloc(sizeof(char) * 4);
  strcpy(x, "abc");
  return(x);
}

int main(void) {
  char *a;
  a = f();
  printf("%s", a);
  free(a);
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

是否x必须释放函数中的变量?如果是这样,当我需要退货时,这怎么可能呢?

c memory malloc free dynamic

11
推荐指数
1
解决办法
8789
查看次数

cython中的cython共享内存.parallel.prange - block

我有一个函数foo,它将一个指向内存的指针作为参数,并且对该内存进行写入和读取:

cdef void foo (double *data):
   data[some_index_int] = some_value_double
   do_something_dependent_on (data)
Run Code Online (Sandbox Code Playgroud)

data这样分配:

cdef int N = some_int
cdef double *data = <double*> malloc (N * sizeof (double))

cdef int i
for i in cython.parallel.prange (N, nogil=True):
    foo (data)

readout (data)
Run Code Online (Sandbox Code Playgroud)

我现在的问题是:不同的线程如何对待这个?我的猜测是指向的内存data将由所有线程共享,并在函数内部"同时"读取或写入foo.这会弄乱所有结果,因为人们不能依赖先前设定的数据值(内部foo)?我的猜测是正确的还是在cython编译器中实现了一些神奇的安全带?

非常感谢你提前.

python malloc parallel-processing cython python-multithreading

11
推荐指数
2
解决办法
3091
查看次数

为什么C标准中没有"recalloc"?

每个人都知道:

  • realloc 调整现有内存块的大小或将其复制到更大的块.
  • calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.

为什么C标准没有提供如下结合上述两者的功能?

void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)

调整大型哈希表或自定义内存池的大小不是很有用吗?

c malloc allocation realloc calloc

11
推荐指数
2
解决办法
3659
查看次数

内存碎片

当我随机地使用malloc()s和free()s,嵌套并且具有不同的大小时,在某些时候内存将被分段,因为这些操作留下了大量的小内存区域,后面是非连续的,因此不能被分配为一个更大的块.

关于这个的一些问题:

  • 如果经常这样做,以便内存被强制分段,然后所有这些内存区域都是free()d,我可以假设这些空闲区域连接回原来的连续大小吗?

  • 当我总是执行a malloc()后跟free()相同的内存并且从不嵌套这些调用时,在分配/释放的大小总是不同的情况下,内存是否也在这种情况下碎片化?

c memory malloc memory-fragmentation

11
推荐指数
2
解决办法
3522
查看次数

对齐malloc实现的解释

这不是作业,这纯粹是为了我自己的个人教育.

我无法弄清楚如何实现一个对齐的malloc所以在网上查找并找到了这个网站.为方便阅读,我将发布以下代码:

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

void* aligned_malloc(size_t required_bytes, size_t alignment)
{
    void* p1; // original block
    void** p2; // aligned block
    int offset = alignment - 1 + sizeof(void*);
    if ((p1 = (void*)malloc(required_bytes + offset)) == NULL)
    {
       return NULL;
    }
    p2 = (void**)(((size_t)(p1) + offset) & ~(alignment - 1));
    p2[-1] = p1;
    return p2;
}

void aligned_free(void *p)
{
    free(((void**)p)[-1]);
}

void main (int argc, char *argv[])
{
    char **endptr;
    int *p = aligned_malloc (100, strtol(argv[1], …
Run Code Online (Sandbox Code Playgroud)

c malloc pointers

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