我正在用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的实例。现在我实例化一个...
如何在堆栈上为指向对象的指针分配内存?
首先这是一个非常非常糟糕的主意。