2014-09-26 68 views
1

这是我的代码。该计划得到了一些点坐标,它应该列举所有路径(这应该是未来更加复杂,但这是本质)递归内存错误

#include <iostream> 
#include <utility> 
#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <cmath> 
using namespace std; 

struct Point { 
    Point() {}; 
    Point (const int &x_, const int &y_) : x{x_}, y{y_} {}; 
    int x, y; 
}; 

double distance(const Point &a, const Point &b) { 
    return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2)); 
} 
struct Path { 
    vector<Point> points; 
    double length; 
    Path(vector<Point> &p) : points{p}, length{0.0} {}; 
    void add_point(Point &p) { 
    length += distance(p, points.back()); 
    points.push_back(p); 
    } 
}; 


vector<Path*> enumerate_paths(vector<Point> &coordinates) { 
    // assuming coordinates is not empty 
    vector<Path*> result; 

    unsigned int size = coordinates.size(); 
    if (size == 1) { 
    result = {new Path{coordinates}}; 
    return result; 
    } 

    vector<Point> coordinates_copy; 
    vector<Path*> recursion_result; 

    for(unsigned int i = 0; i < size; ++i) { 
    cout << "cycle start" << endl << flush; 
    coordinates_copy = coordinates; 

    coordinates_copy.erase(coordinates.begin()+i); 

    // Get results for one coordinate skipped 
    recursion_result = enumerate_paths(coordinates_copy); 
    cout << "recursion done" << endl << flush; 
    // Add the coordinate to each of those results 
    for_each(recursion_result.begin(), recursion_result.end(), 
     [&](Path *path) { 
      path->add_point(coordinates.at(i));}); 

    // Concatenate with previous results 
    copy(recursion_result.begin(), recursion_result.end(), back_inserter(result)); 
    cout << "cycle end" << endl << flush; 
    } 
    cout << "escape recursion" << endl << flush; 
    return result; 
} 

int main() { 
    vector<Point> coordinates = { Point(0,0), Point(1,0), Point(0,1), Point(1,1)}; 
    auto paths = enumerate_paths(coordinates); 
    cout << "done!" << flush; 
} 

我相信,该算法的思路是正确的,但我发现了一个内存错误,我不明白 - 双免费或腐败(出)。我用g ++ -Wall -std = C++ 11编译没有错误。这里发生了什么?有人可以帮忙吗?

回答

5

我不能答应你,这是唯一的问题,但就在这里:

coordinates_copy.erase(coordinates.begin()+i); 

您是使用迭代器从一个不同的载体erase ING。将coordinates.begin()更改为coordinates_copy.begin()

另外,delete的内存你new;)。或者更好的是,切换到智能指针。或者甚至完全忘记指针,并依赖于vector的移动构造函数和返回值优化。