【发布时间】:2017-04-03 07:02:43
【问题描述】:
我正在尝试从函数返回一个向量。我的代码编译并且我检查了我的函数并认为错误来自返回部分。它编译得很好(使用 Cygwin),但是在运行它时,我得到一个 Aborted (core dumped) 错误。 这是我的代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
//function that returns the square
int f(int n)
{
return n*n;
}
vector<int> myVec;
int counter = 0;
//function that uses f on all elements in a list
vector<int> map(vector<int> something)
{
//base case
if(counter == something.size())
{
/*cout << "hello" << endl;
for (int i=0; i<counter; i++)
{
cout << "vector: " << myVec[i] << endl;
}*/
counter=0;
return myVec;
}
//recursion
else
{
//cout << "counter: " << counter << endl;
int n = f(something[counter]);
//cout << "n: " << n << endl;
myVec.push_back(n);
//cout << "vector: " << myVec[counter] << endl;
counter++;
map(something);
}
}
int main()
{
//making vectors
vector<int> L;
vector<int> L1;
vector<int> L2;
for (int i=0; i<20; i++)
{
L.push_back(i);
}
L1 = map(L);
}
代码最初来自一个类文件。
【问题讨论】:
-
编译代码时打开警告,然后它会告诉您“并非所有路径都返回值”。由于返回的对象的析构函数由编译器调用,并且当您“不返回任何内容”时会返回垃圾,因此使用垃圾作为输入调用析构函数 - 这很可能会崩溃,因为有效的向量将包含指针等。
-
我在编译时使用了
-Wall,只是收到关于比较有符号和无符号整数的警告以及关于控制到达非空函数结束的警告。 -
不相关,但在递归调用中使用全局参数不是一个好的设计,除非您证明您的函数不是线程安全的,并且将其封装在另一个初始化全局变量的函数中。
-
是的,因为 counter 最初在我的构造函数中。
-
那么你使用的是非常旧版本的 gcc 吗? clang 和 gcc 都给了我一个警告 - clang 甚至没有要求 -Wall。