我从C风格函数中获得了指向一大块已分配内存的指针.现在,调试目的非常有趣,以了解此指针指向的已分配内存块有多大.
是否有什么比通过盲目地越过边界而挑起异常更优雅?
提前谢谢,安德烈亚斯
我在Windows上使用VC++ 2005,在Linux上使用GCC 4.3
我_msize在VC++ 2005下不幸的是它在调试模式下导致异常....
好.我尝试过上面描述的方式,但有效.至少在我调试并确保在调用库退出后立即执行时,我会在缓冲区边界上运行.奇迹般有效.
它只是不优雅,绝不可用于生产代码.
我一直在一些项目上使用C获得硕士学位,但从未使用它构建生产软件.(.NET和Javascript是我的面包和黄油.)显然,需要free()记忆你malloc()在C中是至关重要的.如果你能在一个例行程序中做到这两件事,这很好,很好.但是随着程序的发展和结构的深入,跟踪什么是malloc"适合自由的地方和哪些内容"变得越来越难.
我查看了互联网,只找到了一些通用的建议.我怀疑的是,你们中的一些长期C编码员已经提出了自己的模式和实践来简化这个过程并将邪恶置于你面前.
那么:您如何建议构建C程序以防止动态分配成为内存泄漏?
可能重复:
free和malloc如何在C中工作?
考虑一种情况,我必须通过malloc分配大约20个字节的内存.对于malloc()的函数调用是否成功,20个字节是否应该在内存中连续可用或者是否可以分散?例如,在上面的例子中,如果有4个或5个块,每个10个字节,malloc会工作吗?或者这是特定于操作系统还是特定于编译器?
在常见的实现中,例如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实际上收缩返回的缓冲区malloc中realloc调用,在这个意义上,高达M字节可以返回到空闲列表?更重要的是,它是否有可能重新分配缓冲区?
我想知道,因为我刚刚在上面实现了动态数组numpy.ndarray,而我正在做一个resize调用realloc,以获得最终的大小.我可以跳过决赛resize作为优化(以牺牲永久性分配为代价),我想知道这是否值得尝试.
我遇到了以下代码:
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的倍数.还有其他规则吗?
#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必须释放函数中的变量?如果是这样,当我需要退货时,这怎么可能呢?
我有一个函数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
每个人都知道:
realloc 调整现有内存块的大小或将其复制到更大的块.calloc 确保内存归零并防止算术溢出,并且通常面向大型阵列.为什么C标准没有提供如下结合上述两者的功能?
void *recalloc(void *ptr, size_t num, size_t size);
Run Code Online (Sandbox Code Playgroud)
调整大型哈希表或自定义内存池的大小不是很有用吗?
当我随机地使用malloc()s和free()s,嵌套并且具有不同的大小时,在某些时候内存将被分段,因为这些操作留下了大量的小内存区域,后面是非连续的,因此不能被分配为一个更大的块.
关于这个的一些问题:
如果经常这样做,以便内存被强制分段,然后所有这些内存区域都是free()d,我可以假设这些空闲区域连接回原来的连续大小吗?
当我总是执行a malloc()后跟free()相同的内存并且从不嵌套这些调用时,在分配/释放的大小总是不同的情况下,内存是否也在这种情况下碎片化?
这不是作业,这纯粹是为了我自己的个人教育.
我无法弄清楚如何实现一个对齐的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)