root.left用malloc分配地址了,为什么在pushDown()结束之后,root.left又没有初始化了

img

img


root.left用malloc分配地址了,为什么在pushDown()结束之后,root.left又没有初始化了

作用区有限,变量定义再花括号里面是局部变量,函数返回后就释放了

【以下回答由 GPT 生成】

回答:

在C++中,使用malloc分配内存是一种C风格的内存分配方式,它只会分配内存空间并返回一个指向该内存空间的指针。但是,它并不会调用类的构造函数来初始化对象,因此在使用malloc分配内存后,对象的成员变量并没有被正确初始化。

对于类的成员变量,我们建议使用new关键字来进行内存分配和初始化。new关键字会先调用类的构造函数初始化对象,然后返回一个指向对象的指针。

以下是我给出的一个使用new关键字来初始化对象的示例代码:

class Node {
public:
    int value;
    Node* left;
    Node* right;

    Node(int val) {
        value = val;
        left = nullptr;
        right = nullptr;
    }
};

void pushDown(Node* root) {
    root->left = new Node(10);
}

int main() {
    Node* root = new Node(5);

    pushDown(root);

    // 确保root.left被正确初始化
    if (root->left != nullptr) {
        // 打印初始化的值
        std::cout << root->left->value << std::endl;
    }

    // 释放内存
    delete root->left;
    delete root;

    return 0;
}

在上述代码中,我们使用new关键字来分配并初始化root对象和root.left对象。在pushDown()函数中,我们设置了root对象的left成员变量为一个新生成的Node对象。

通过这种方式,我们可以保证root.leftpushDown()函数结束后被正确初始化。请注意,在不再需要这些对象时,我们需要使用delete关键字来释放它们占用的内存空间,以避免内存泄漏的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^