首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >指针未正确传递对象

指针未正确传递对象
EN

Stack Overflow用户
提问于 2018-06-02 08:49:39
回答 1查看 68关注 0票数 1

我正在尝试用c++编写堆栈,但似乎遇到了问题。

代码语言:javascript
复制
#include "stdafx.h"
#include <iostream>

using namespace std;

class Node {

public:

    int node_value;
    Node * previous_node;

};



class Stack {

public:
    Node * node_pointer;
    int size = 0;

    void push(int number) {

        Node NewNode;

        NewNode.node_value = number;
        cout << number << endl;


        if (size == 0) {

            node_pointer = &NewNode;
            cout << node_pointer << endl;
            size += 1;
            cout << "Pushed" << endl;

        }

        else if (size > 0)
        {
            NewNode.previous_node = node_pointer;
            node_pointer = &NewNode;
            cout << "Pushed" << endl;
            size += 1;
        }
    }

    void pop() {

        if (size > 1) {

            Node Temp_Node = *node_pointer;
            cout << Temp_Node.node_value << endl;
            node_pointer = Temp_Node.previous_node;
            size -= 1;
        }

        else if (size == 1){
            size -= 1;
            Node Temp = *node_pointer;
            cout << Temp.node_value;

        }

        else {
            cout << "empty" << endl;
        }

    }



};


int main()
{
    Stack stack;
    Node a;
    Node b;
    Node * p1;
    int num = 5;
    a.node_value = num;
    p1 = &a;
    b = *p1;
    cout << b.node_value << endl;
    stack.push(10);
    stack.pop();
    system("PAUSE");
    return 0;
}

它返回的不是节点值,而是一个地址。我有点困惑,因为当我对节点做同样的事情时,它工作得很好。在堆栈中,我将地址复制到指针node_pointer中,当我通过取消指针的引用来创建新节点时,它会返回完全不同的实例变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 09:01:51

问题来自于函数push(),'newNode‘是堆栈上的一个变量,编译器将在函数结束时自动调用其析构函数。

为了避免这种情况,您应该使用'new‘操作符在堆上创建'newNode’,函数pop()负责释放内存(使用'delete‘操作符)。

如果'new‘和'delete’操作符让你感到困惑,你可以使用'std::shared_ptr‘代替。

代码语言:javascript
复制
void push(int number) {

    Node *NewNode = new Node{};

    NewNode->node_value = number;

    if (size == 0) {

        node_pointer = NewNode;
        cout << node_pointer << endl;
        size++;
        cout << "Pushed" << endl;

    }

    else if (size > 0)
    {
        NewNode->previous_node = node_pointer;
        node_pointer = NewNode;
        size++;
        cout << "Pushed" << endl;
    }
}

void pop() {

    if (size > 1) {

        Node* Temp_Node = node_pointer;
        cout << Temp_Node->node_value << endl;
        delete node_pointer;
        node_pointer = Temp_Node->previous_node;
        size--;
    }

    else if (size == 1) {
        Node* Temp = node_pointer;
        cout << Temp->node_value << endl;
        delete node_pointer;
        node_pointer = nullptr;
        size--;
    }

    else {
        cout << "empty" << endl;
    }

}

你也可以利用SmartPointer的优势:你没有责任在堆上‘新建’和‘删除’对象。

代码语言:javascript
复制
#include <memory>
using namespace std;
class Node {
    using node_ptr = std::shared_ptr<Node>;
public:
    int node_value;
    node_ptr previous_node;
};

class Stack {
    using node_ptr = std::shared_ptr<Node>;
public:
    node_ptr node_pointer = nullptr;
    int size = 0;

void push(int number) {

    node_ptr NewNode = std::make_shared<Node>();

    NewNode->node_value = number;

    if (size == 0) {
        node_pointer = NewNode;
        cout << node_pointer << endl;
        size++;
        cout << "Pushed" << endl;
    }

    else if (size > 0)
    {
        NewNode->previous_node = node_pointer;
        node_pointer = NewNode;
        size++;
        cout << "Pushed" << endl;
    }
}

void pop() {

    if (size > 1) {

        node_ptr Temp_Node = node_pointer;
        cout << Temp_Node->node_value << endl;
        //delete node_pointer; 
        //no need to delete here, it will be automatically destructed when Temp_Node leaves this scope.
        node_pointer = Temp_Node->previous_node;
        size--;
    }

    else if (size == 1) {
        node_ptr Temp = node_pointer;
        cout << Temp->node_value << endl;
        //delete node_pointer;
        node_pointer = nullptr;
        size--;
    }

    else {
        cout << "empty" << endl;
    }

}

};

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50652571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档