# include <iostream>
# include <string>
using std::string;
using std::cout;
using std::endl;
string func() {
string abc = "some string";
return abc;
}
string func1(string s) {
cout << "I got this: " << s << endl;
}
int main() {
func1(func());
}
这给出了:
$ ./a.out
I got this: some string
Segmentation fault (core dumped)
发生段错误b / c,我正在尝试访问未正确初始化的参数s
。这是b / c abc
超出范围并在对func()
的调用完成后被销毁了。 这种理解正确吗?
答案 0 :(得分:3)
您在func1()
中遇到问题。它被定义为返回std::string
,但函数中任何地方都没有return
语句。这是未定义的行为,也是段错误的可能原因。修复该问题,其余代码应可以正常工作。
答案 1 :(得分:1)
不,您的理解是错误的。
abc
超出范围,但这不是问题,因为您要返回它的副本。
看这里:
string func1(string s) {
cout << "I got this: " << s << endl;
}
您说该函数将返回一个string
,但是您什么也不返回。
该程序在尝试销毁您未返回的字符串时会发生问题,因为销毁不存在的内容非常有问题。
一个合理的编译器应该就此警告您。
您需要返回一个字符串,或声明返回值void
。
答案 2 :(得分:1)
func1应该返回string
(与析构函数关联的对象,
但您没有返回一个。
(使用-Wall
进行编译以获取有关此信息的警告。)
因此,当调用func1
返回的字符串(NOT)的析构函数时,
在main
范围的末尾,它将与一个内存为垃圾的字符串对象一起使用
并且很可能会导致段错误。
实际上,如果您在Linux上使用g ++编译程序并在gdb
下运行,
在对free的调用中发生段错误-大概是std :: string的析构函数
试图释放无效的对象。