我使用了一堆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不是指针。
答案 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()
然而,销毁对象并不意味着堆栈释放已经分配的内存。它可以为将来可以推入堆栈的元素保留它。