2017-10-29 41 views
0

配列内の別のクラスにネストされているクラスを削除しようとしています。私は、オブジェクトの参照へのポインタを作成することによって、それを別の方法を削除しようとしたビジュアルまし削除時のエラー:式は完全なオブジェクト型へのポインタである必要があります

「という表現は、完全なオブジェクト型へのポインタでなければならない」:私は述べインテリセンスのエラーを取得しますStudioのエラーが出て、基本的にはデバッグシンボルがロードされていないことを示すdllエラーが表示されます。

graphl.cpp IはrmNDを試みた場合

GraphL::~GraphL() 
{ 
    NodeData* rmND; // remove NodeData 
    GraphNode* rmGN; // remove GraphNode 

    for (int i = 1; i <= size; i++) 
    { 

    deleteEdges(adjList[i]->edgeHead); 

    rmGN = adjList[i]; 
    delete rmGN->data; //////////////// <-- error here 
    rmGN->edgeHead = nullptr; 
    delete rmGN; 
    } 

    delete[] adjList; 
} 

graphl.h

class GraphL { 

public: 
    GraphL(); 
    ~GraphL(); 

    void buildGraph(istream& infile); 
    void depthFirstSearch(); 
    //void displayGraph(); 

private: 
    struct EdgeNode { 
    int adjGraphNode; 
    EdgeNode* nextEdge; 
    EdgeNode() : adjGraphNode(0), nextEdge(nullptr) {}; 
    }; 
    struct GraphNode { 
    EdgeNode* edgeHead; 
    NodeData data; 
    bool visited; 
    GraphNode() : edgeHead(nullptr), visited(false) {}; 
    }; 

    static const int MAXNODES = 6; 
    GraphNode* adjList[MAXNODES]{}; // adjacency list 
    //void makeEmpty(); 
    int size; 
    bool insertEdge(int from, int to); 
    void dfsHelper(int search); 
    void deleteEdges(EdgeNode* remove); 

}; 

nodedata.h

class NodeData { 
    friend ostream & operator<<(ostream &, const NodeData &); 

public: 
    NodeData();   // default constructor, data is set to an empty string 
    ~NodeData();   
    NodeData(const string &);  // data is set equal to parameter 
    NodeData(const NodeData &); // copy constructor 
    NodeData& operator=(const NodeData &); 

    // set class data from data file 
    // returns true if the data is set, false when bad data, i.e., is eof 
    bool setData(istream&);     

    bool operator==(const NodeData &) const; 
    bool operator!=(const NodeData &) const; 
    bool operator<(const NodeData &) const; 
    bool operator>(const NodeData &) const; 
    bool operator<=(const NodeData &) const; 
    bool operator>=(const NodeData &) const; 

private: 
    string data;   
}; 

-

は、ここでは、コードの断片であります= rmGN-> data; rmNDを削除します。 Visual Studioはwntdll.pdbにロードされていないエラーを表示します。そのオブジェクトを適切に削除するにはどうすればよいですか?どんな助けもありがとう!ありがとうございました。

+0

オフトピックですが、配列インデックスは0からN-1に、1からNにはなりません。 – chris

+0

0はNULLです。使用されていないので、それには何も起こりません。オブジェクトは1-Nから挿入されました。 – endanegered

+0

@endanegered - * 0はNULLです。使用されていないので、何も起こりません* - あまりにも多くのプログラムが失敗したのは、1ベースの配列を偽造しようとしているからです。その「0」要素が誤って使用されたか、配列の最後にインデックスが1回だけ表示されます。配列を '0'で始めるだけです。 – PaulMcKenzie

答えて

0

削除しようとしているアイテムは動的メモリへのポインタではなく、オブジェクトのローカルなので、メモリをクリアするために親オブジェクトを削除する必要があります。

具体的には、newキーワードを使用して明示的に作成されたメモリセクションのみを削除できます。

オブジェクトを削除する必要はありません。

関連する問題