C ++传递指向静态函数的指针在执行期间改变值

时间:2011-07-06 11:03:31

标签: c++

这是我的代码

Node* Node::createNode(int n)
{
    Node newNode(n);
    Node *temp = &newNode;
    return temp;
}

void Node::printNode(Node* node)
{
    cout << node->data << "\t" << node->next << endl;
    system("pause");
}

这是主要功能

int main(int argc, char* argv[])
{

    Node *head = Node::createNode(10);
    Node::printNode(head);
    return 0;
}

问题,我原本打算打印10.相反,我的垃圾值为-858993460。我注意到,直到这一点,参数传递给函数,它保留正确的值。但是在函数printNode中,值会发生变化。所以我觉得函数调用出了问题。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:8)

您正在返回指向局部变量的指针。当你稍后在main函数中使用该指针时,它指向的变量早已消失,你进入了undefined behavior的领域。

您可以按值返回节点:

Node Node::createNode(int n)
{
    Node newNode(n);
    return newNode;
}

或者您可以动态分配一个并向其返回smart pointer,从而启用范围绑定资源管理(又称RAII):

std::unique_ptr<Node> Node::createNode(int n)
{
    return std::unique_ptr<Node>(new Node(n));
}

答案 1 :(得分:2)

您正在Node中返回指向本地作用域createNode的指针。这是一个坏事(tm)。当该函数超出范围(即返回)时,谁知道你指向的内容会发生什么。

而是使用以下之一:

  1. 复制构造(并按值返回)
  2. 在堆上分配(new Node)并返回(首先使用智能指针)

答案 2 :(得分:0)

你在创建节点的方式上有误:

Node* Node::createNode(int n)
{
    Node newNode(n);       // create a node on stack
    Node *temp = &newNode; // get address of the node on stack
    return temp;           // return that address
}                          // and here the node is destructed!

您应该通过 operator new()在堆中分配它。

另请参阅Stack, Static, and Heap in C++http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/进行解释。

答案 3 :(得分:0)

您将返回对本地

的引用
Node newNode(n);
Node *temp = &newNode;
return temp;

newNode超出范围,被后来的堆栈内容覆盖。

答案 4 :(得分:0)

在Node :: createNode()函数中,您将返回局部变量的地址。这是一个重大的失误。从函数返回后,Node对象的生命周期超出范围,它将从堆栈中弹出。