我有一个名为Object的类,它存储一些数据.
我想通过引用使用如下函数返回它:
Object& return_Object();
Run Code Online (Sandbox Code Playgroud)
然后,在我的代码中,我会这样称呼它:
Object myObject = return_Object();
Run Code Online (Sandbox Code Playgroud)
我编写了这样的代码并编译.但是,当我运行代码时,我总是遇到一个seg错误.通过引用返回类对象的正确方法是什么?
我有一个iOS swift程序,可以在Xcode Beta2上编译和运行.当我下载beta4时,我纠正了新的快速语言的一些语法错误.我现在得到这个错误:
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
问题是它没有告诉我这个错误在哪里,所以我可以进一步解决它.在哪里可以键入-v以"查看调用"并进一步排除故障?没有这个,绝对没有办法找出问题所在.提前致谢.
我试图从函数返回指针.但我得到分段错误.有人请告诉代码有什么问题
#include<stdio.h>
int *fun();
main()
{
int *ptr;
ptr=fun();
printf("%d",*ptr);
}
int *fun()
{
int *point;
*point=12;
return point;
}
Run Code Online (Sandbox Code Playgroud) 这是给出段错误的程序.
#include <iostream>
#include <vector>
#include <memory>
int main()
{
std::cout << "Hello World" << std::endl;
std::vector<std::shared_ptr<int>> y {};
std::cout << "Hello World" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
当然,程序本身绝对没有错.segfault的根本原因取决于其构建和运行的环境.
我们在亚马逊上使用构建系统,该系统以几乎与机器无关的方式构建和部署二进制文件(lib和bin).对于我们的情况下,基本上意味着它部署的可执行文件(从上面的程序内置)到和几乎所有的依赖(即共享库)进入.为什么我使用的短语"几乎"是因为共享库,比如,,和可能的其他几个人,从系统(即从可执行选秀权).请注意,这是应该挑选从不过.$project_dir/build/bin/$project_dir/build/lib/libc.solibm.sold-linux-x86-64.so.2/lib64libstdc++$project_dir/build/lib
现在我运行如下:
$ LD_LIBRARY_PATH=$project_dir/build/lib ./build/bin/run
segmentation fault
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行它,而不设置LD_LIBRARY_PATH.它运行正常.
以下是ldd这两种情况的信息(请注意,我编辑了输出,以便在存在差异的地方提及库的完整版本)
$ LD_LIBRARY_PATH=$project_dir/build/lib ldd ./build/bin/run
linux-vdso.so.1 => (0x00007ffce19ca000)
libstdc++.so.6 => $project_dir/build/lib/libstdc++.so.6.0.20 …Run Code Online (Sandbox Code Playgroud) 考虑使用C程序(请参阅此处的实时演示).
const int main = 195;
Run Code Online (Sandbox Code Playgroud)
我知道在现实世界中没有程序员编写这样的代码,因为它没有任何用处,也没有任何意义.但是当我const从程序上方删除关键字时,它会立即导致分段错误.为什么?我很想知道这背后的原因.
GCC 4.8.2在编译时会发出以下警告.
警告:'main'通常是一个函数[-Wmain]
Run Code Online (Sandbox Code Playgroud)const int main = 195; ^
为什么const关键字的存在和缺失会对程序的行为产生影响?
在编写项目时,我遇到了一个奇怪的问题.
这是我设法编写的用于重新创建问题的最小代码.我故意将一个实际的字符串存储在其他地方,并分配了足够的空间.
// #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <stddef.h> // For offsetof()
typedef struct _pack{
// The type of `c` doesn't matter as long as it's inside of a struct.
int64_t c;
} pack;
int main(){
pack *p;
char str[9] = "aaaaaaaa"; // Input
size_t len = offsetof(pack, c) + (strlen(str) + 1);
p = malloc(len);
// Version 1: crash
strcpy((char*)&(p->c), str);
// Version 2: crash
strncpy((char*)&(p->c), str, strlen(str)+1);
// Version 3: works!
memcpy((char*)&(p->c), str, strlen(str)+1); …Run Code Online (Sandbox Code Playgroud) 在Linux中:
什么是分段错误?我知道它会崩溃程序,但这是某种内存泄漏问题,还是完全不相关的东西?另外,你如何处理这些?这通常是计算机设置或应用程序本身的问题吗?
此外,这是否也发生在其他操作系统中?
一个假设的问题,你们都要咀嚼......
我最近在SO上回答了另一个问题,其中一个PHP脚本是segfaulting,它让我想起了我一直想知道的东西,所以让我们看看是否有人可以对它有所了解.
考虑以下:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Run Code Online (Sandbox Code Playgroud)
显然,这个(无用的)函数无限循环.最终,由于每个对函数的调用都是在前一个调用完成之前执行的,因此会耗尽内存.有点像没有分叉的叉形炸弹.
但是......最终,在POSIX平台上,脚本会死于SIGSEGV(它也会死在Windows上,但更优雅 - 只要我极其有限的低级调试技能可以说明).循环次数取决于系统配置(分配给PHP的内存,32位/ 64位等)和操作系统,但我真正的问题是 - 为什么会发生段错误?
出于好奇,我正在尝试生成堆栈溢出.此代码根据OP生成堆栈溢出,但是当我在我的机器上运行它时,它会生成分段错误:
#include <iostream>
using namespace std;
int num = 11;
unsigned long long int number = 22;
int Divisor()
{
int result;
result = number%num;
if (result == 0 && num < 21)
{
num+1;
Divisor();
if (num == 20 && result == 0)
{
return number;
}
}
else if (result != 0)
{
number++;
Divisor();
}
}
int main ()
{
Divisor();
cout << endl << endl;
system ("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此外,根据这篇文章,一些例子也应该做同样的事情.为什么我会得到分段错误呢?