删除错误:表达式必须是指向完整对象类型的指针

时间:2017-10-29 01:27:16

标签: c++ pointers

我正在尝试删除嵌套在数组内另一个类中的类。我收到一个智能错误说明:

  

"表达式必须是指向完整对象类型的指针"

我尝试通过创建指向对象引用和Visual Studio错误的指针来尝试删除它,并给出了一个dll错误,基本上说明调试符号未加载。

以下是代码片段 -

graphl.cpp

 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;          
};

如果我试过rmND = rmGN-&gt;数据;删除rmND; Visual Studio给了我一个wntdll.pdb未加载的错误。如何正确删除该对象?任何帮助表示赞赏!谢谢。

1 个答案:

答案 0 :(得分:0)

您要删除的项目不是指向动态内存的指针,它是对象的本地对象,因此必须删除父对象才能清除内存。

更准确地说,您只能删除使用new关键字明确创建的内存部分。

无需删除对象。