错误删除了指向矢量数组的指针。 看下面的代码,我需要带有V(顶点数)大小的“new”矢量数组。 顺便说一句,我有理由在这里使用数组和“新”。请不要使用“新”/“删除”操作来解决问题。
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;
}
答案 0 :(得分:3)
你使用了错误的delete
。您需要使用 array-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;
}