2014-09-26 65 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的移動構造函數和返回值優化。