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

Posted

技术标签:

【中文标题】删除时出错:表达式必须是指向完整对象类型的指针【英文标题】:Error on delete: expression must be a pointer to a complete object type 【发布时间】:2017-10-29 01:27:16 【问题描述】:

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

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

我尝试通过创建指向对象引用的指针来删除它,然后 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);

;

节点数据.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->data;删除rmND; Visual Studio 给了我一个 wntdll.pdb 未加载错误。如何正确删除该对象?任何帮助表示赞赏!谢谢。

【问题讨论】:

离题,但数组索引从 0 到 N-1,而不是从 1 到 N。 0 为 NULL。它未使用,因此没有任何事情发生。对象是从 1-N 插入的。 @endanegered -- 0 为 NULL。它没有被使用,因此没有任何事情发生——我见过太多的程序失败了,因为它们试图伪造基于 1 的数组。要么0 元素被意外使用,要么索引在数组末尾一次性使用。只需在0 开始您的阵列。 @PaulMcKenzie 明白,但在这种情况下并不是真正的选择。这是一个赋值,我们被告知从 1 - N 开始。如果传递 0 以在该实例处插入对象,则程序结束。 您实际上是在学习如何在程序中引入不必要的错误。 0 索引仍然有效,如果我每个实例都有一美元,我发现它被错误地用于基于 1 的假数组程序中,我会成为一个有钱人。 【参考方案1】:

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

更准确地说,您只能删除使用 new 关键字显式创建的一段内存。

不需要删除对象。

【讨论】:

以上是关于删除时出错:表达式必须是指向完整对象类型的指针的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的“表达式必须具有指向对象类型”和“下标需要数组或指针类型”是啥意思?

从 2D 向量创建 1D 向量的函数(错误:表达式必须具有指向对象的指针类型)

指向不完整类型的指针可以不完整吗?

当向量在内部类中时,如何删除指向对象的向量指针

指针向量可能不存在的对象

明显调用的表达式前的括号必须具有(指针)函数类型