我试图找出如果我试图从中间"释放"指针会发生什么,请看下面的代码:
char *ptr = (char*)malloc(10*sizeof(char));
for (char i=0 ; i<10 ; ++i)
{
ptr[i] = i+10;
}
++ptr;
++ptr;
++ptr;
++ptr;
free(ptr);
Run Code Online (Sandbox Code Playgroud)
我收到一个崩溃,出现未处理的异常错误消息.我想了解为什么以及如何免费工作,这样我不仅知道如何使用它,而且还能够理解奇怪的错误和异常并更好地调试我的代码ץ
非常感谢
malloc()和HeapAlloc()有什么区别?据我所知,malloc从堆中分配内存,就像HeapAlloc一样,对吧?
那么区别是什么呢?
谢谢!
我在Xcode中启用了内存检查(编辑方案 - >选项).我在设备调试时执行以下操作:dyld: could not load inserted library '/usr/lib/libgmalloc.dylib' because image not found.积极采取措施,希望在周期早期发现错误.
内存检查在设备上无效吗?它似乎是有效的,因为它是根据http://lists.apple.com/archives/xcode-users/2012/Mar/msg00271.html确认和调查的.此外,Xcode在编译和链接期间没有抱怨.如果它对设备无效,为什么Xcode会插入库?有什么解决方案吗?谷歌搜索返回了几个点击,但我没有看到任何具体的解决方案.
如何在设备上调试时启用Xcode Guard Malloc?
我测试了memcpy()在i*4KB时注意速度急剧下降的速度.结果如下:Y轴是速度(MB /秒),X轴是缓冲区的大小memcpy(),从1KB增加到2MB.子图2和子图3详述了1KB-150KB和1KB-32KB的部分.
环境:
CPU:Intel(R)Xeon(R)CPU E5620 @ 2.40GHz
操作系统:2.6.35-22-通用#33-Ubuntu
GCC编译器标志:-O3 -msse4 -DINTEL_SSE4 -Wall -std = c99

我想它必须与缓存相关,但我无法从以下缓存不友好的情况中找到原因:
由于这两种情况的性能下降是由不友好的循环引起的,这些循环将分散的字节读入高速缓存,浪费了高速缓存行的其余空间.
这是我的代码:
void memcpy_speed(unsigned long buf_size, unsigned long iters){
struct timeval start, end;
unsigned char * pbuff_1;
unsigned char * pbuff_2;
pbuff_1 = malloc(buf_size);
pbuff_2 = malloc(buf_size);
gettimeofday(&start, NULL);
for(int i = 0; i < iters; ++i){
memcpy(pbuff_2, pbuff_1, buf_size);
}
gettimeofday(&end, NULL);
printf("%5.3f\n", ((buf_size*iters)/(1.024*1.024))/((end.tv_sec - \
start.tv_sec)*1000*1000+(end.tv_usec - start.tv_usec)));
free(pbuff_1);
free(pbuff_2);
}
Run Code Online (Sandbox Code Playgroud)
考虑到来自@ usr,@ ChrisW和@Leeor的建议,我更准确地重新测试了测试,下面的图表显示了结果.缓冲区大小从26KB到38KB,我每隔64B测试一次(26KB,26KB + …
我在第5行的错误中遇到了以下代码的问题:
错误:无效转换
void*为char*
我正在使用g ++和codeblocks,我试图将此文件编译为cpp文件.有关系吗?
#include <openssl/crypto.h>
int main()
{
char *foo = malloc(1);
if (!foo) {
printf("malloc()");
exit(1);
}
OPENSSL_cleanse(foo, 1);
printf("cleaned one byte\n");
OPENSSL_cleanse(foo, 0);
printf("cleaned zero bytes\n");
}
Run Code Online (Sandbox Code Playgroud) 我有一个长期存在的应用程序,频繁的内存分配 - 释放.任何malloc实现都会将释放的内存返回给系统吗?
在这方面,什么是以下行为:
如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?
如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾.
最近在我的C肌肉上工作,并查看我一直在使用它的许多图书馆,这当然让我很好地了解了什么是好的做法.我没见过的一件事是一个返回结构的函数:
something_t make_something() { ... }
Run Code Online (Sandbox Code Playgroud)
从我所吸收的,这是"正确"的方式:
something_t *make_something() { ... }
void destroy_something(something_t *object) { ... }
Run Code Online (Sandbox Code Playgroud)
代码片段2中的体系结构比片段1更受欢迎.所以现在我问,为什么我会直接返回一个结构,就像在代码片段1中一样?当我在两种选择中做出选择时,我应该考虑哪些差异?
此外,该选项如何比较?
void make_something(something_t *object)
Run Code Online (Sandbox Code Playgroud) 什么malloc(0)回报?答案是否相同realloc(malloc(0),0)?
#include<stdio.h>
#include<malloc.h>
int main()
{
printf("%p\n", malloc(0));
printf("%p\n", realloc(malloc(0), 0));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
linux gcc的输出:
manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
Run Code Online (Sandbox Code Playgroud)
输出每次都在变化malloc(0).这是标准答案吗?除了学术研究之外,为什么有人会对获得这样的指针感兴趣?
编辑:
如果malloc(0)返回虚拟指针,那么后续工作原理如何:
int main()
{
void *ptr = malloc(0);
printf("%p\n", realloc(ptr, 1024));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下代码为每次迭代输出"可能".为什么不失败?
#include<stdio.h>
#include<malloc.h>
int main()
{
int i;
void *ptr;
printf("Testing using BRUTE FORCE\n");
for (i=0; i<65000; i++)
{
ptr = malloc(0);
if (ptr == realloc(ptr, 1024))
printf("Iteration %d: possible\n", …Run Code Online (Sandbox Code Playgroud) 在C API中分配内存的正确/首选方法是什么?
我首先看到两个选项:
1)让调用者完成所有(外部)内存处理:
myStruct *s = malloc(sizeof(s));
myStruct_init(s);
myStruct_foo(s);
myStruct_destroy(s);
free(s);
Run Code Online (Sandbox Code Playgroud)
该_init和_destroy功能是必需的,因为一些更多的内存可分配里面,而且必须在某个地方处理.
这样做的缺点是更长,但在某些情况下也可以消除malloc(例如,它可以传递给堆栈分配的结构:
int bar() {
myStruct s;
myStruct_init(&s);
myStruct_foo(&s);
myStruct_destroy(&s);
}
Run Code Online (Sandbox Code Playgroud)
此外,调用者必须知道结构的大小.
2)隐藏mallocs in _init和freein in _destroy.
优点:代码更短,因为无论如何都会调用函数.完全不透明的结构.
缺点:无法传递以不同方式分配的结构.
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
Run Code Online (Sandbox Code Playgroud)
我目前正在倾向于第一个案例; 然后,我不知道C API设计.
tcmalloc/jemalloc是改进的内存分配器,并且还引入了内存池以实现更好的内存分配.那么它们之间有什么区别以及如何在我的应用程序中选择它们呢?