C++ C++;释放堆块3da9e0后,在3daa08处对其进行了修改
我在这个网站上看到了一些解决方案,但没有一个解决了我的问题。 我正在实现一个n-children的非平衡树类型,add操作给了我一个异常。 代码如下: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<
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设置为某物)都可能会损坏内存管理器。如果我告诉你这是一个写得很糟糕的代码,会让你感觉好一点吗?