Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SIGBUS何时使用新位置?_C++_Linux_G++ - Fatal编程技术网

C++ SIGBUS何时使用新位置?

C++ SIGBUS何时使用新位置?,c++,linux,g++,C++,Linux,G++,我有以下代码(已更新): 我看到一些人提到了内存对齐问题,我检查了0x7ffff7ff8000是否可以被2、8、16、32和64整除。然后,我不知道它期望什么样的对齐。还是别的什么 提前感谢。您似乎正在尝试在此处创建文件并写入其中,因此最初它的大小为零,占用的内存页为零。但是mmap无法写入超过文件末尾的内容,从而有效地为您分配内存:首先,它如何知道要添加到文件中的字节数?您需要确保/tmp/abc.txt包含一些字符,这些字符随后可能会被放置位置new覆盖。它不能追加 在我将大约8个随机字节写

我有以下代码(已更新):

我看到一些人提到了内存对齐问题,我检查了0x7ffff7ff8000是否可以被2、8、16、32和64整除。然后,我不知道它期望什么样的对齐。还是别的什么


提前感谢。

您似乎正在尝试在此处创建文件并写入其中,因此最初它的大小为零,占用的内存页为零。但是
mmap
无法写入超过文件末尾的内容,从而有效地为您分配内存:首先,它如何知道要添加到文件中的字节数?您需要确保
/tmp/abc.txt
包含一些字符,这些字符随后可能会被放置位置
new
覆盖。它不能追加

在我将大约8个随机字节写入
/tmp/abc.txt
后,运行您的程序成功,并通过

63 00 00 00 00 00 00 00

正如在我的x86-64上所预期的那样。然后程序报告您可能打算生成的
msync
错误,并优雅地退出。

主要有三个问题。第一个是对齐:您需要确保指针与要放置的类型正确对齐。第二个更正式:为了使用标准库中的“placement”placement new操作符,您需要包含它的头,即
。第三,您应该通过从
new
表达式返回的类型化指针访问对象,而不是强制转换原始指针。感谢您的快速输入。我已经完成了你建议的第二和第三步。但还是一样的问题。对于#1,如何确保内存对齐(以便携方式)?我有点依赖于mmap在页面中运行,所以它返回的地址将与页面对齐。很好的捕获!实际上我并不想产生更多的错误;因此,我在这里创建了另一个帖子:@Hel我做到了,这就是我回答中最后一句话的意思。但是为什么msync调用会失败是另外一个问题,我没有认真研究过。不用担心。这是我愚蠢的打字错误造成的((谢谢!或者您可以在
mmap
fruncate()之后使用
ftruncate(fd,length)
address: 0x7ffff7ff8000

Program received signal SIGBUS, Bus error.
0x0000000000400adb in main () at msync.cpp:20
20      auto tptr = new (ptr) S();
63 00 00 00 00 00 00 00