2016-11-24 13 views
-2

C++でのエラーベクトル配列へのポインタの削除。 以下のコードを見ると、V(頂点数)サイズのベクトルの「新しい」配列が必要です。 btw、私はここで配列と "新しい"を使用する理由があります。 "新しい"/"削除"操作を使用しないで、問題を回避しないでください。C++削除ベクトルの配列へのポインタ<int>

class Graph 
{ 
    int V; // No. of vertices 
    vector<int> *adj; // An array of adjacency lists 
public: 
    Graph(int V); 
    ~Graph(); 
... 
}; 

// implementation 
Graph::Graph(int V) 
{ 
    this->V = V; 
    adj = new vector<int>[V]; 
} 

Graph::~Graph() 
{ 
    int v; 
    for (v = 0; v < V; v++) { 
     adj[v].clear(); 
    } 
    delete adj; 
} 


int main() 
{ 
    int V=100; 
    Graph g(V); 
    return 0; 
} 
+4

あなたは '' delete []を使用する必要があります。そして、何がエラーですか? – songyuanyao

+0

なぜ地球上で 'ベクトル *'を使用していますか? –

答えて

3

あなたは正しくないdeleteを使用しています。あなたはを配列-deleteを使用する必要があります(そして、あなたはまた、明示的にclear()ベクトルを必要としない):

Graph::~Graph() 
{ 
    delete [] adj; 
} 

実は、あなたが別のstd::vector、またはstd::unique_ptrを使用してではなく、生のポインタを格納する必要があります。

また、コピーコンストラクタまたはコピー代入演算子を指定しないことによってRule of Threeに違反しています。次の操作を実行した場合、あなたは深刻な問題を抱えています:

Graph f = g; 

std::unique_ptr<std::vector<int>[]>としてポインタを保存する(あなたはそれのためのコピーコンストラクタを作らない限り)上記は違法になるだろう。 std::vector<std::vector<int>>を保存すると、デフォルトで正しく動作します。

しかし、あなたは手動でそれをやっているので、あなたはコピーコンストラクタを削除し、代入演算子をコピーしたり、あなた自身を提供するために、いずれかの必要があります:

Graph::Graph(const Graph & other) 
{ 
    V = other.V; 
    adj = new vector<int>[V]; 
    std::copy(other.adj, other.adj + V, adj); 
} 

Graph& Graph::operator=(const Graph & other) 
{ 
    if(this != &other) 
    { 
     Graph tmp(other); 
     std::swap(V, tmp.V); 
     std::swap(adj, other.adj); 
    } 
    return *this; 
} 
+0

私は "delete [] adj;"しようとしました。それは動作します。他の2つの問題を指摘してくれてありがとう。しかし、std:; copy&std :: swapはadj上では動作しません。adjは、配列ではなくベクトルへのポインタです。代わりにベクトル>を使用しようとします。 –

関連する問題