C ++面向对象的问题

时间:2014-05-21 14:46:52

标签: c++ object scope

嘿,我不熟悉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?但结果是一些随机的内存地址。

2 个答案:

答案 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。