我正在编写一个内存分配器,我需要一种方法在内存块中存储一个整数。这个整数将表示块的大小,因此我可以在指针指向开头的情况下导航到末尾。
下面是我的测试示例:
//编辑: testInt int* testInt =新int的声明空间;
head_ptr = (char*) malloc(4*1024*1024); // Allocate 4MB
// EDIT: Should have used std::fill and std::copy
memset(head_ptr,23,sizeof(int)); // Set Address head_ptr = 12345
memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr
printf("testInt = %i",testInt);
这会在第二行到最后一行引发分段错误。
我想做的事有意义吗?
如果是的话,正确的做法是什么?
非常感谢大家的帮助!问题解决:-)
发布于 2010-04-01 02:40:25
对原问题的回答
memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345
不,没有。这将head_ptr
的第一个head_ptr
字节设置为12345,这将溢出(除非您使用的是一个字节大于8位的体系结构)。
memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr
testInt是什么?一个int*?一个int?在后一种情况下,Use&testInt。
此外,从标记中可以看出,您使用的是C++而不是C。但是您的代码实际上是C,您应该使用更安全的C++函数和特性:
回答您的编辑
int* testInt;
是一个指向整数变量的指针,但它没有初始化:它将指向一个随机内存区域(我们可以考虑它的所有意图和目的,即使它不是随机的)。
然后,memcpy
将尝试写入最有可能无法访问的随机内存区域,从而导致分段错误(这意味着“您无法访问此内存区域”)。
发布于 2010-04-01 02:42:31
您从未初始化过testInt,所以您的memcpy调用是写给谁知道在哪里的。
试试这个:
int *testInt = malloc(sizeof(int));
发布于 2010-04-01 02:55:20
其他人则评论了memset(3)
和memcpy(3)
的不当使用,因此我将回答分配器问题。
如果您真的在C++中构建自定义内存分配器,那么请看一下Alexandrescu的现代C++设计中的第4章。它将向您详细介绍实现小对象分配器的过程。该代码可作为洛基图书馆的一部分使用。
伙计,有人喜欢独角兽.)
https://stackoverflow.com/questions/2557804
复制相似问题