局部变量作为函数调用的参数

时间:2018-11-04 20:47:37

标签: c++

# 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()的调用完成后被销毁了。 这种理解正确吗?

3 个答案:

答案 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的析构函数 试图释放无效的对象。