从结构

时间:2015-05-30 09:17:12

标签: c++ struct stack pop

我使用了一堆struct。

struct stack_values {
    long long int sp;
    bool sign; //true=sum, false=sub
    long long int imm;
};
static std::stack<stack_values> sosp;

我使用此代码推送到堆栈;

stack_values sosp_values;
sosp_values.sp = 0; 
sosp_values.sign = true;
sosp_values.imm = 0;
sosp.push(sosp_values);

我想知道当我推动sosp.pop(); C++时,sosp_values释放了为stack_values top = sosp.top(); sosp.pop(); delete top; 分配的内存。

如果没有。我怎样才能释放记忆。

findcontrol

上面的代码不起作用,因为变量top不是指针。

1 个答案:

答案 0 :(得分:0)

当您推送结构时,堆栈会将其复制到其内部存储器中,从而创建一个新对象,该对象是方法推送的参数的副本。当你调用方法pop时,堆栈会调用相应内部对象的析构函数。

这是一个简单的示范程序

#include <iostream>
#include <stack>

struct A
{
    A() { std::cout << "A::A()" << std::endl; }
    A( const A & ) { std::cout << "A::A( const & )" << std::endl; }
    ~A() { std::cout << "A::~A()" << std::endl; }
};

int main()
{
    std::stack<A> st;

    std::cout << "Calling push()" << std::endl;
    for ( size_t i = 0; i < 3; i++ ) st.push( A() );

    std::cout << "\nCalling pop()" << std::endl;
    while ( !st.empty() ) st.pop();
}

程序输出

Calling push()
A::A()
A::A( const & )
A::~A()
A::A()
A::A( const & )
A::~A()
A::A()
A::A( const & )
A::~A()

Calling pop()
A::~A()
A::~A()
A::~A()

然而,销毁对象并不意味着堆栈释放已经分配的内存。它可以为将来可以推入堆栈的元素保留它。