2011-11-23 90 views
0

我已经writen此程序:C++字符串流分段错误

#include <sstream> 
#include <math.h> 
#include <string> 
#include <vector> 
using namespace std; 

double distance(vector<double> *, vector<double> *, int); 
const char* distances(vector<vector<double>* >, int); 

double distance(vector<double> a, vector<double> b){ 
    double result = 0, di; 
    for(int i=0;i<a.size();i++){ 
     di = a[i] - b[i]; 
     result += di*di; 
    } 
    return sqrt(result); 
} 

const char* distances(vector<vector<double>* > vectors, int accuracy=1){ 
    stringstream graphstr; 
    graphstr << "strict graph {\n"; 
    for(int i=0; i<vectors.size();i++){ 
     int j=i+1; 
     while(j<vectors.size()){ 
      graphstr << "\t" << i << " -- " << j << "\t [len=" << distance(vectors[i],vectors[j]) << "];\n"; 
      j+=accuracy; 
     } 
    } 
    graphstr << "}\n"; 
    return graphstr.str().c_str(); 
} 

vectors.size()比70 greather它给了我一个分段错误。问题是什么?

当我没有添加新的蜇graphstr它是确定的。

+1

你尝试了所有警告编译代码启用和调试信息(例如Linux上的'g ++ -Wall -g')?然后使用调试器(即Linux上的'gdb'或其''ddd' GUI前端)! –

回答

6

您正在返回指向退出函数时取消分配的字符串的指针。

+0

,我该怎么办? – microo8

+0

例如,返回'std :: string' - 'graphstr.str()' –

+0

它的工作原理!谢谢!我不知道是什么问题。但我想要一个const char *作为返回值,而我用swig做了一个python扩展,并且swig从const char *创建了一个PyString。但我解决了它与一个typemap: '%typemap(out)(string){ $ result = PyString_FromString($ 1.c_str()); }' – microo8

0

试试这个

更改您的返回值从为const char *为char *和

char* buff = new char[4096]; 
strcpy(buff,graphstr.str().c_str(),graphstr.str().size()); 
return buff; 

记得释放内存返回的使用delete

+1

他会忘记,我建议改变返回类型和返回字符串(实际上,我* *推荐它已经:)) –

+0

哈哈,是的,你确实= = – Cyclonecode

+0

我是一个诚实同伴,并不会说谎发现的直接危险;-) –