从结构堆栈弹出时释放内存

Freeing the memory when pop from stack of struct

我用的是stack of 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;

上面的代码没有运行,因为变量 top 不是指针。

当您推送结构时,堆栈将其复制到其内部内存中,创建一个新对象,该对象是方法推送的参数的副本。当您调用方法 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()

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