Tag: 内存管理

带有指针的int矩阵 – 内存分配混乱

我在生成int矩阵时遇到了一些问题而没有产生内存泄漏。 我希望能够通过read_matrix()动态地将给定(全局)矩阵制作成任意大小。 但后来我希望能够在以后释放内存。 所以在我的main方法中,第二个printf应该导致总线错误,因为它不应该分配任何内存。 我将如何创建这个? int** first_matrix; int** second_matrix; int** result_matrix; int** read_matrix(int size_x, int size_y) { int** matrix; matrix = calloc(size_x, sizeof(int*)); for(int i = 0;i<size_x;i++) { matrix[i] = calloc(size_y, sizeof(int)); } for(int i = 0;i<size_x;i++) { for(int j = 0;j<size_y;j++) { matrix[i][j] = i*10+j; } } return matrix; } int main(int stackc, char** […]

使用Ctrl-C中断程序时如何释放动态分配的空间?

给出以下代码: #include int main() { int *p; p = (int *)malloc(10 * sizeof(int)); while(1); return 0; } 当编译并运行上面的代码,并且在执行时按Ctrl + C中断代码时,如何释放分配给p的内存? 这里的操作系统有什么作用? 它与C ++的情况有什么不同,使用new运算符?

不释放内存是否可以接受

我正在研究一个应该从命令行使用的项目,其语法如下: program-name input-file 该程序应该处理输入,计算一些东西并在stdout上吐出结果。 我选择的语言是C ++,原因有几个我不想辩论。 计算阶段将是高度符号化的(思考编译器)并将使用非常复杂的动态分配数据结构。 特别是,它不适合RAII风格的编程。 我想知道忘记释放内存是否可以接受,因为我希望整个计算消耗的内存少于可用内存,并且程序完成后OS可以在一步中自由回收所有内存(假设程序终止)很快)。 你对此有何看法? 作为备份计划,如果我的项目需要以服务器或交互方式运行,我认为我总是可以将垃圾收集器重新编译为源代码。 有没有人有使用C ++垃圾收集器的经验? 他们运作良好吗?

失败的malloc()的unit testing

unit testing涉及失败的malloc()代码路径的最佳方法是什么? 在大多数情况下,它可能并不重要,因为你正在做类似的事情 thingy *my_thingy = malloc(sizeof(thingy)); if (my_thingy == NULL) { fprintf(stderr, “We’re so screwed!\n”); exit(EXIT_FAILURE); } 但在某些情况下,除了死亡之外你还有其他选择,因为你已经为缓存或其他任何东西分配了一些额外的东西,你可以收回那些记忆。 但是,在那些您可以尝试从失败的malloc()中恢复的情况下,您在代码路径中执行的操作非常棘手且容易出错,这使得测试变得尤为重要。 你是怎么做到这一点的?

为什么malloc(0)在Windows中返回非空地址?

下面的代码在Windows中执行时返回一个地址,虽然我希望它返回NULL。 int main() { char *ptr = NULL; ptr = malloc(0); printf(“malloc returned = %u\n”, ptr); } 什么可能促使malloc的这种实现? 它背后有什么理由吗? 因为,这是一个0字节的内存,我没有尝试写任何数据。 但是,这个记忆可以用于任何东西吗?

在混合C / C ++程序中调整malloc和new的“正确”方法是什么?

我有一个混合的C / C ++程序。 它包含一个以C / C为目标的flex / bison解析器,其余为C ++。 作为C,生成的解析器和扫描程序使用malloc , realloc和free管理它们的内存。 它们足以暴露钩子,允许我提交我自己的这些函数的实现。 正如您所料,(C ++)程序的其余部分“希望”使用new , delete等。 做一点研究似乎表明相关标准并不能保证这种混合应该起作用。 特别是C“堆”不一定是C ++“自由区”。 看来这两个方案可以互相践踏。 最重要的是,有一天(很快),该程序可能希望集成一个自定义的堆实现,例如tcmalloc ,由C和C ++使用。 在这里做什么是“正确”的事情? 鉴于需要集成tcmalloc(它解释了如何与C程序链接),我很想在C ++内存管理中找到一些跨类型,跨线程,跨所有重载/挂钩/任何内容。 有了这个,我可以将所有C ++分配/释放调用指回它们的C等价物(反过来又落在tcmalloc上。) 是否存在这样的泛星系全局C ++钩子? 可能它已经在做我想要的,类似于ios_base::sync_with_stdio默认秘密地与iostream和stdio结合? 我对谈论stdio与iostreams以及切换解析器生成器以及使用C ++ flex / bison骨架(它们引入独立的头痛)并不感兴趣。 编辑 :请包括支持您的答案的C ++标准的那些部分的名称。

嵌入式系统上的malloc行为

我目前正在开发一个嵌入式项目(STM32F103RB,CooCox CoIDE v.1.7.6 with arm-none-eabi-gcc 4.8 2013q4),我正在尝试理解当RAM满时malloc()在纯C上的行为。 我的STM32有20kB = 0x5000Bytes的RAM,0x200用于堆栈。 #include #include “stm32f10x.h” struct list_el { char weight[1024]; }; typedef struct list_el item; int main(void) { item * curr; // allocate until RAM is full do { curr = (item *)malloc(sizeof(item)); } while (curr != NULL); // I know, free() is missing. Program is supposed […]

关于C / C ++堆栈分配

在学习C ++(和C)时,我对堆栈分配的工作有一些特别的疑问,我无法找到解决方案: 堆栈分配是否隐式调用malloc / free函数? 如果不; 如何确保堆栈分配和堆分配之间没有冲突? 如是; C ++中的堆栈分配是否也隐式调用new / delete? 如是; 重载一个类的new运算符会影响它的堆栈分配吗? 它在VC ++中产生了令人困惑的结果; 但由于VC ++并不完全符合标准(或者我听说过),我决定在这里问一下……

Carrays实例化 – 堆栈或堆分配?

我保证之前已经问过这个问题,但是我无法通过搜索找到它; 对于任何裁员,提前抱歉。 这是我(可能错误的)理解,只有在编译时知道对象的大小时才分配给堆栈。 因此,在初始化数组的情况下,您可以执行其中一个(这应该在堆栈上): char charArray[50]; 由于此数组的大小在编译时是已知的,因此应该没有问题。 另一方面,这(我相信)也是有效的代码: char anotherCharArray[someVariable + 50]; 这也会在堆栈上进行吗? 我很确定代码段错误如果你释放()这个,所以它让我觉得它确实如此,但它对我来说并没有多大意义。 同样,100%唯一的情况是,当通过malloc分配数据时,你必须使用free()? 在此先感谢您的帮助。

为什么要使用_mm_malloc? (与_aligned_malloc,alligned_alloc或posix_memalign相对)

获取对齐的内存块有几个选项,但它们非常相似,问题主要归结为您所针对的语言标准和平台。 C11 void * aligned_alloc (size_t alignment, size_t size) POSIX int posix_memalign (void **memptr, size_t alignment, size_t size) 视窗 void * _aligned_malloc(size_t size, size_t alignment); 当然,手动对齐也是一种选择。 英特尔提供另一种选择 英特尔 void* _mm_malloc (int size, int align) void _mm_free (void *p) 根据英特尔发布的源代码,这似乎是分配工程师喜欢的对齐内存的方法,但我找不到任何将其与其他方法进行比较的文档。 我发现的最接近的只是承认存在其他对齐的内存分配例程。 https://software.intel.com/en-us/articles/memory-management-for-optimal-performance-on-intel-xeon-phi-coprocessor-alignment-and 要动态分配一块对齐的内存,请使用posix_memalign,它由GCC和Intel Compiler支持。 使用它的好处是您不必更改内存处理API。 您可以像往常一样使用free()。 但要注意参数配置文件: int posix_memalign(void ** memptr,size_t align,size_t size); 英特尔编译器还提供另一组内存分配API。 C / […]