C++ C++;释放堆块3da9e0后,在3daa08处对其进行了修改

C++ C++;释放堆块3da9e0后,在3daa08处对其进行了修改,c++,tree,heap,C++,Tree,Heap,我在这个网站上看到了一些解决方案,但没有一个解决了我的问题。 我正在实现一个n-children的非平衡树类型,add操作给了我一个异常。 代码如下: struct Node { // Just to initialize the parent node to zero, default constructor Node(Node *parent = 0) : m_parent(parent) { } Node *m_parent; vector<

我在这个网站上看到了一些解决方案,但没有一个解决了我的问题。 我正在实现一个n-children的非平衡树类型,add操作给了我一个异常。 代码如下:

struct Node {
    // Just to initialize the parent node to zero, default constructor
    Node(Node *parent = 0) : m_parent(parent) {
    }

    Node *m_parent;
    vector<Node *> m_children;
    GameBoard m_currentBoard;
};
struct节点{
//只需将父节点初始化为零,默认构造函数
节点(节点*父节点=0):m_父节点(父节点){
}
节点*m_父节点;
向量m_儿童;
游戏板m_电流板;
};
发生错误的位置:

Node *tempNode = 0;

// Going through each of them to create new nodes
for (unsigned int  i = 0; i < availableBoards.size() ; i++) {
    // Create a new node
    tempNode = new Node;
    tempNode->m_parent = curNode;
    tempNode->m_currentBoard.setBoard(availableBoards[i]);

    // This is the line when program crashes
    curNode->m_children.push_back(tempNode); 
}
Node*tempNode=0;
//检查每个节点以创建新节点
for(无符号int i=0;im_parent=curNode;
tempNode->m_currentBoard.setBoard(可用板[i]);
//这是程序崩溃时的一行
curNode->m_children.push_back(tempNode);
}
我还尝试在循环中声明tempNode,但也没有任何帮助

我在Visual Studio中查看了手表,
curNode
不是空的,
tempNode

为什么我会犯这个错误


谢谢您的回答。

好的,问题是在调用第二个代码段之前就破坏了运行该代码段的对象。大致如下:

class A{
     int *getAsdf();
     int *asdf;
}

int main() {
    A *newObj = new A;
    delete newObj;
    newObj->getAsdf();
}

对于如何从以前删除的对象调用方法,我没有任何线索。在像getAsdf这样的函数中发生了错误,甚至参数都是有效的。有人能解释一下吗?

你确定
curNode
是有效的(非null并不意味着有效)?似乎它已经被释放了,我已经仔细检查了它,我通过参数传递了它。只有它的父字段为空(根节点),但子向量的大小为0。“存在”并不表示有效性。释放内存会将旧数据保留在原来的位置,以便它在调试器中仍然看起来“有效”。无效的参数是this指针。因为这是一个非虚拟函数,所以函数调用是可以的,但是对它的任何取消引用都将在无效内存上操作。对this指针的任何写入(例如,将this->asdf设置为某物)都可能会损坏内存管理器。如果我告诉你这是一个写得很糟糕的代码,会让你感觉好一点吗?