c ++删除指向vector <int>数组的指针

时间:2016-11-24 03:41:51

标签: c++ pointers vector

C ++中的

错误删除了指向矢量数组的指针。 看下面的代码,我需要带有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;
}

1 个答案:

答案 0 :(得分:3)

你使用了错误的delete。您需要使用 array-delete (并且您也不需要明确地clear()向量):

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

实际上,您应该使用另一个std::vectorstd::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;
}