【问题标题】:push object in the heap using pointer to the static container使用指向静态容器的指针将对象推送到堆中
【发布时间】:2018-02-12 07:14:02
【问题描述】:
class Node_Str{
public:
string name;
string value;
string type;
Node_Str(string name,string value,string type){
name=name;
value=value;
type=type;}};    

static stack<Node_Str> s;
void find_token(string input){
int cursor=0;
string current="";
while(cursor<input.length()){
char value;
value=input[cursor];
cout<<value<<endl;
if(value=='('||value==')'||value=='+'||value=='-
'||value=='*'||value=='/'){
Node_Str* p=new Node_Str("pare",string(1,value),"Pare");
s.push(*p);
cursor++;
delete p;}
if(value==' '){
cursor++;
}
if(value=='1'||value=='2'||value=='3'||value=='4'){
Node_Str* p=new Node_Str("num",string(1,value),"Number");
s.push(*p);
cursor++;
delete p;}}}
int main(){
while(!s.empty()){
cout<<s.top().value<<" ";
s.pop();   }
return 0; }

find_token 函数应该用空格分隔输入字符串,并使用该字符串的值构造Node_Str 对象。然后在 主要功能,我想打印它。字数有限。只是'1','2','3','4','+,'-','*','/'。 输入是 4 + 4 ,输出应该是 4+4。但是,没有输出。

【问题讨论】:

  • 你没有删除使用new int分配的内存,那就是内存泄漏
  • 可能你忘了打find()
  • 程序可以运行而没有错误或内存泄漏。 这种说法是错误的。您正在泄漏内存。您正在分配内存 uisng new int(i),但没有代码可以释放该内存。
  • 编译所有警告和调试信息(g++ -Wall -Wextra -gGCC...)然后使用调试器gdb)和valgrind。在使用它们之前阅读每个container 和其他函数的文档。
  • 你的意思是如果我删除指针然后我可以得到正确的输出?更重要的是,我确信 main() 函数返回 0。

标签: c++ static stl stack


【解决方案1】:

cmets 已经说过内存泄漏和忘记调用 find。

除此之外,堆栈是一个容器,最后被推入其中的将是第一个被弹出的容器。为了输出 0 1 2 3,您需要按 3 2 1 0 的顺序入栈。

只是提供一个更好的版本。

#include <iostream>
#include <stack>

using std::cout;
using std::stack;

static stack<int> s;

void find()
{
    int* p;
    for (int i = 3; i >= 0; i--) {
        p = new int(i);
        s.push(*p);
        delete p; // p itself does not have to be returned so it can be safely deleted here
        //This can also ne replaced by directly using s.push(i)
    }
}

int main() {
    find();
    while (!s.empty()) 
    {
        cout << s.top() << " ";
        s.pop();
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    正如 leyanpan 所建议的,数据应该按相反的顺序推送,以获得所需的输出。还有一点是不需要动态分配 int 类型。将非数组内置类型存储在堆栈而不是堆中总是更好。 同样将堆栈数据结构分配为静态变量会将范围扩展到程序终止。最好将堆栈对象用作 main 中的局部变量,并将其作为参考参数传递给函数 find。

    【讨论】:

    • 确实如此。现在,当我使用堆栈存储自己定义的类的对象时,我遇到了问题。 stack.top() 应该返回对象,但是我不能使用 stack.top()->name。 “名称”是我班级的公共变量。
    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 2014-01-01
    • 1970-01-01
    • 2013-03-14
    • 2013-10-01
    相关资源
    最近更新 更多