1

我正在编写一个内存分配器,我需要一种将整数存储在一块内存中的方法。这个整数将表示块的大小,因此我可以在给出指向开头的指针的情况下导航到结尾。

这是我的测试示例:

// 编辑:为 testInt 声明空间 int* testInt = new 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);

这会在倒数第二行引发分段错误。

我想做的事情有意义吗?

如果是这样,正确的方法是什么?

非常感谢大家的帮助!!问题解决了 :-)

4

5 回答 5

5

回答原始问题

memset(head_ptr,12345,sizeof(int)); // Set Address head_ptr = 12345

不,它没有。这会将第一个sizeof(int)字节设置head_ptr为 12345,这将溢出(除非您使用的架构中一个字节超过 8 位)。

memcpy(testInt,head_ptr,sizeof(int)); // Set testInt = head_ptr

什么是 testInt?一个整数*?一个整数?在后一种情况下,使用 &testInt。

从您的标签中也可以看出您使用的是 C++ 而不是 C。但是您的代码实际上只是 C,您应该真正使用更安全的 C++ 函数和特性:

  • memset -> std::fill
  • memcpy -> std::copy
  • malloc -> 新的
  • printf -> cout 或(更好的)Boost::Format

回答您的编辑

int* testInt;是一个指向整数变量的指针,但它没有被初始化:它将指向一个随机内存区域(我们可以认为它是“随机的”,即使它不是)。

memcpy然后将尝试写入这个您很可能无权访问的随机内存区域,因此这会导致分段错误(这意味着“您无法访问此内存区域”)。

于 2010-04-01T02:40:25.963 回答
2

您从未初始化过 testInt,因此您的 memcpy 调用正在写给谁知道在哪里。

试试这个:

int *testInt = malloc(sizeof(int));

于 2010-04-01T02:42:31.523 回答
2

其他人评论了 and 的不当使用memset(3)memcpy(3)所以我将回复分配器问题。

如果您真的从事在 C++ 中构建自定义内存分配器的业务 - 请查看 Alexandrescu 的Modern C++ Design中的第 4 章。它会详细引导您实现小对象分配器。该代码作为Loki 库的一部分提供。

伙计,有人喜欢独角兽...... :)

于 2010-04-01T02:55:20.793 回答
1

由于无法看到testInt我无法确定的内容,但我的心理调试能力表明您需要将地址testInt而不是testInt自身作为memcpy.

编辑:看到您现在发布的内容后,您需要testInt在使用之前分配内存。

于 2010-04-01T02:41:16.173 回答
1

如果 testInt 只是一个“int”,可能是因为你通过值传递它,并且它没有被改变?

于 2010-04-01T02:42:21.270 回答