我如何在堆栈上为指向对象的指针分配内存?

问题描述 投票:0回答:1

我正在用C ++实现一个字符串的链接堆栈,主要是出于乐趣。列表的每个对象都是Node实例,列表本身是StackOfStrings的实例。现在,我使用Node实例化一个新的new,并且一切正常,但是我似乎无法弄清楚如何在堆栈上实例化Node并在以后的代码中引用它。] >

[我尝试在first = new Node;方法内用first = &Node();更改push(),但是当我调用std::bad_alloc方法时,我得到了运行时pop()错误。我的猜测是,此Node在堆栈上创建,并在程序退出push()方法后立即销毁。所以我的问题是:有没有办法创建在堆栈上创建的first并分配给Node并将其保留以备后用?

我包括代码的基本内容,在引起问题的行旁边添加了注释。

class StackOfStrings
{
public:
    StackOfStrings() {}; // Could be omitted, default constructor

    void push(std::string item)
    {
        Node* old_first = first;
        first = new Node;         // *** my question revolves around this line ***
                                  // ***    "first = &Node()" does not work    ***
                                  // ***  how can I have a Node on the stack?  ***
        first->setItem(item);
        first->setNext(old_first);
    }

    std::string pop()
    {
        std::string item = first->getItem();
        first = first->getNext();
        return item;
    }

private:
    Node *first = nullptr;
};

为了完整性,这是Node类:

class Node
{
public:
    std::string getItem() { return item; }
    Node* getNext() { return next; }
    void setItem(std::string item) { this->item = item; }
    void setNext(Node *node) { this->next = node; }

private:
    std::string item;
    Node* next = nullptr;
};

编辑:我写错了* Node而不是&Node。我更新了问题。

编辑2:我尝试过的一个小实验:

  • 我叫push()StackOfStrings方法,将单词“ hello”插入到链表中。
  • setItem()Node方法内插入了一个断点,以检查世界“ hello”是否已保存在内存中。确实,在内存地址0x00FFF900,我发现了值68 65 6c 6c 6f,它对应于ASCII中的“ hello”]
  • 然后我在getItem()的调用中放置了另一个断点,以便再次分析相同的内存地址。我现在发现的a0 fb ff 00 28是垃圾,当然不是“ hello”。
  • 我正在用C ++实现一个字符串的链接堆栈,主要是出于乐趣。列表中的每个对象都是Node实例,列表本身是StackOfStrings的实例。现在我实例化一个...

c++ pointers stack new-operator heap-memory
1个回答
0
投票

如何在堆栈上为指向对象的指针分配内存?


0
投票

首先这是一个非常非常糟糕的主意。

© www.soinside.com 2019 - 2024. All rights reserved.