嘿,我不熟悉C ++中的面向对象编程(用Java编写),我对此有一些疑问。
我有两种方法
void Manager::generate(){
// Generate robot basis
Matrix4 robotBasis = generateRobotBasis();
// Create Human
LinkedList * ll = new LinkedList();
createLL(ll);
Node *j = ll->GetRoot();
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
...
}
void Manager::createLL(LinkedList * ll){
Node node();
ll->InsertRoot(&node);
Node node2();
ll->InsertChild(&node, &node2);
Node node3();
ll->InsertChild(&node2, &node3);
Node *j = &node;
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
j = ll->GetRoot();
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
}
结果:
00ABF540
00ABF498
00ABF540
00ABF498
00ABF540
00CB83A8
最后一列应该是00ABF498
?但结果是一些随机的内存地址。
答案 0 :(得分:0)
我们没有LinkedList插入方法代码,所以它只是对问题根源的预感
假设insertRoot和insertChild没有分配节点对象,代码中的“Node”对象在Manager :: createLL范围的末尾结束它们的生命(它们在堆栈上分配 )。所以只需在堆上分配它们: 你可以试试这个:
void Manager::createLL(LinkedList * ll){
Node* node = new node ();
ll->InsertRoot(node);
Node* node2 = new Node ();
ll->InsertChild(node, node2);
Node* node3 = new node ();
ll->InsertChild(node2, node3);
Node *j = node;
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
j = ll->GetRoot();
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
}
您能够查看根目录地址的原因不是因为insertRoot正在运行。你刚刚复制了地址,但是当你离开“CreateLL”时,root的节点也被释放,地址指的是一些不相关的内存。
另外,请注意节点对象内存的释放以避免内存泄漏(当前的C ++标准没有内置的垃圾回收)。
答案 1 :(得分:0)
如果删除()
以使代码实际编译,您将在列表中存储过时指针(除非您将节点复制到树中而不是存储指针)。
这些指向被调用createLL
时被破坏的局部变量
取消引用其中任何一个都是未定义的,如果你尝试,你很可能会得到垃圾值或崩溃。
如果你想要一个对象超过&#34;超过&#34;要创建它的函数调用,您必须使用new
。
应该更像这样(未经测试):
void Manager::generate(){
// Generate robot basis
Matrix4 robotBasis = generateRobotBasis();
// Create Human
LinkedList ll;
createLL(ll);
Node *j = ll.GetRoot();
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
...
}
void Manager::createLL(LinkedList & ll){
Node* node = new Node;
ll.InsertRoot(node);
Node* node2 = new Node;
ll.InsertChild(node, node2);
Node* node3 = new Node;
ll.InsertChild(node2, node3);
Node *j = node;
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
j = ll->GetRoot();
std::cout << j << "\n";
j = j->pChild_;
std::cout << j << "\n";
}
Java和C ++有很大的不同 - 你需要忘掉大量的Java。