Tag: 内存管理

矢量化的strlen逃脱阅读未分配的内存

在研究OSX 10.9.4的strlen实现时,我注意到它总是比较一个16字节的块并向前跳过到后面的16个字节,直到它遇到’\0 ‘。 相关部分: 3de0: 48 83 c7 10 add $0x10,%rdi 3de4: 66 0f ef c0 pxor %xmm0,%xmm0 3de8: 66 0f 74 07 pcmpeqb (%rdi),%xmm0 3dec: 66 0f d7 f0 pmovmskb %xmm0,%esi 3df0: 85 f6 test %esi,%esi 3df2: 74 ec je 3de0 0x10是hex的16字节。 当我看到它时,我想知道:这个记忆也可以不被分配。 如果我分配了一个20字节的C字符串并将其传递给strlen ,它将读取36字节的内存。 为什么允许这样做? 我开始寻找并发现访问数组越界有多危险? 例如,确认它绝对不是一件好事,未分配的内存可能未被映射。 然而,必须有一些东西使这项工作。 我的一些假设: OSX不仅保证其分配是16字节对齐的,而且还保证分配的“量子”是16字节的块。 换句话说,分配5个字节实际上将分配16个字节。 分配20个字节实际上将分配32个字节。 当你编写asm时读取数组的结尾本身并没有坏处,因为它不是未定义的行为,只要它在界限内(在页面内?)。 […]

C – 使用双指针的动态内存分配

我在函数名myalloc()中分配一些内存,并在main()中使用和释放它。 我正在使用双指针来执行此操作,这里的代码工作正常, //Example # 1 #include #include #include void myalloc( char ** ptr) { *ptr = malloc(255); strcpy( *ptr, “Hello World”); } int main() { char *ptr = 0; myalloc( &ptr ); printf(“String is %s\n”, ptr); free(ptr); return 0; } 但是下面的代码不起作用并给出了分段错误。 我认为这是使用双指针的另一种方法。 //Example # 2 #include #include #include void myalloc( char ** ptr) { *ptr […]

我释放后仍然可以打印一个字符串?

我正在学习和测试C中的内存分配,我想测试如果调用free()会发生什么。 我预计在运行下面的程序后可能会出现分段错误或指针为NULL 。 但是,我仍然可以像输出一样成功打印字符串。 我还尝试将str释放两次,然后在输出2发生时出现错误。 似乎先前分配的内存已成功解除分配,但内存中的数据未被清除。 那是对的吗? 如果是这种情况,程序什么时候会清理那些解除分配的内存空间? 如果数据被解除分配但没有清理,那是否安全? 上述任何问题的答案都会有所帮助! 谢谢! 码 #include #include int main() { printf(“Hello, World!\n”); char *str = (char *)malloc(24); char *str2 = “tutorialspoint”; strcpy(str, str2); free(str); printf(“[str] %s\n”, str); return 0; } 产量 Hello, World! [str] tutorialspoint 输出2 main(83218,0x7fff9d2aa3c0) malloc: *** error for object 0x7fb0b2d00000: pointer being freed was not […]

创建此数组时分配的内存在哪里? (C)

假设我做了类似的事情: char* test[] = {“foo”,”bar”,”car”}; 如果我做了很长的路,那究竟是什么呢? 这会自动创建我需要释放的内存吗? 我有点困惑。 谢谢。

如何正确(和有效)释放gtk小部件中的内存

我正在尝试了解如何在完成GTK小部件时正确释放内存,例如,如果我需要创建和销毁许多小部件。 但是,无论我尝试什么,valgrind似乎都表明内存泄漏。 我已经查看了其他问题,包括列出GTK的valgrind抑制文件的问题,但它没有改变结果。 这是重现我的问题的最简单的代码片段: #include “gtk/gtk.h” int main() { GtkWidget * widget = gtk_fixed_new(); g_object_ref(widget); g_object_ref_sink(widget); // remove floating reference, and own this object ourselves g_object_unref(widget); gtk_widget_destroy(widget); } 我的期望是(在处理浮动引用之后),unref()函数应该将引用计数减少到零,然后释放所有内存。 我把gtk_widget_destroy()放在那里以获得良好的衡量标准,但我不确定它实际上是否必要(并且它不会改变泄漏的大小)。 使用valgrind命令输出G_SLICE=debug-blocks valgrind ./t3 –supression=~/Downloads/GNOME.supp来自GTK hello_world程序中的Memory Leaks问题是 ==10079== HEAP SUMMARY: ==10079== in use at exit: 164,338 bytes in 847 blocks ==10079== total heap usage: 1,380 allocs, […]

如何计算指针指向内存的大小?

在我写的一个函数中: char *ab; ab=malloc(10); 然后在另一个函数中我想知道ab指针指向的内存大小。 有什么方法我可以知道ab指向10个内存字符?

识别地址是属于堆还是堆栈还是寄存器

我有一个指针可用于C / C ++变量。 是否有可能准确地确定此变量属于哪个内存段? 如果有,怎么样? 注意:我只有这个变量的地址,如果变量是本地/全局等,则没有进一步的信息。

内存分配问题

在面试的书面回合中提出了这个问题: #include #define MAXROW 3 #define MAXCOL 4 main() { int (*p)[MAXCOL]; p = (int (*)[MAXCOL]) malloc(MAXROW*(sizeof(*p))); } 进程中分配了多少字节? 说实话,我没有回答这个问题。 我不明白对p的任务。 任何人都可以解释一下答案是什么以及如何推断出来?

微控制器内存分配

我一直想着以下问题: 在一个普通的PC中,当你分配一些内存时,你要求操作系统跟踪哪些内存段被占用,哪些内存不被占用,并且不要让你搞乱其他程序内存等等。但是微控制器,我的意思是微控制器没有运行的操作系统所以当你要求一堆内存发生了什么? 你不能简单地访问内存芯片并随机访问它因为它可能被占用…谁跟踪内存的哪些部分已被占用,并为你提供一个免费的存储位置? 编辑: 我用C语言编写了微控制器…我认为答案可能是“语言无关”。 但是让我更清楚一点:我想让这个程序在微控制器上运行: int i=0; int d=3; 是什么让我的i和d变量不存储在内存中的同一个地方?

由C11 aligned_alloc分配的内存重新分配是否保持对齐?

请考虑以下(C11)代码: void *ptr = aligned_alloc(4096, 4096); … // do something with ‘ptr’ ptr = realloc(ptr, 6000); 由于ptr指向的内存与aligned_alloc有一个4096字节的对齐,它(读取:是否保证)在(成功)调用realloc之后保持该对齐? 或者内存可以恢复为默认对齐方式?