소멸자에서 동적배열 삭제 선언시 런타임 에러가 뜹니다.
이플
밑에 중간에 빨갛게 처리해 놓았습니다.
스택소멸자 안에서 동적배열 삭제선언을 하고 실행을 시키면 런타임 오류가 뜹니다.
삭제선언을 지우면 제대로 실행이 되구요.
이유를 알고 싶습니다.
#include string.h
#include iostream
using namespace std;
class stack
{
protected:
double m_size;
int m_top;
double *m_buffer;
public:
bool push(double value);
bool pop(double& value);
double getsize();
double gettop();
bool setsize(double size);
bool getdata(int index, double& data);
stack();
stack(int size);
stack(double a,int p);
void showdata();
~stack();
};
stack::stack()
{
m_size = 0;
m_top = -1;
m_buffer = null;
}
stack::stack(double a,int p)
{
m_size=a;
m_top=p;
}
bool stack::push(double value)
{
if( m_top = m_size - 1 ) return false;
m_buffer[++m_top] = value;
return true;
}
bool stack::pop(double& value)
{
if( m_top 0 ) return false;
value = m_buffer[m_top--];
return true;
}
double stack::getsize()
{
return m_size;
}
double stack::gettop()
{
return m_top;
}
bool stack::setsize(double size)
{
if( size m_size ) return false;
double* tmp = m_buffer;
m_size = size;
m_buffer = new double[m_size];
memcpy(m_buffer, tmp, sizeof(double) * (m_top + 1));
delete [] tmp;
return true;
}
bool stack::getdata(int index, double& data)
{
if( index 0 || index m_top ) return false;
data = m_buffer[index];
return true;
}
void stack::showdata()
{
cout실수 : m_size, 정수 : m_topendl;
}
stack::stack(int size)
{
m_size = size;
m_top = -1;
m_buffer = new double[m_size];
memset(m_buffer, 0, sizeof(double) * m_size);
}
void showdata(stack &s) // 전역 함수
{
cout 스택에 저장된 데이터 : ;
if( s.gettop() == -1 )
cout 없음\n;
else
{
double data;
for(int i = 0 ; i = s.gettop() ; i++)
{
s.getdata(i,data);
cout data ;
}
cout \n;
}
}
stack::~stack(){
delete[] m_buffer;
}int main()
{
stack s2(3.14,10);
s2.showdata();
double data;
stack s1(5);
while( s1.push(rand() % 100) ) ; // 널 문장
showdata(s1);
cout 스택에서 꺼낸 데이터 : ;
while( s1.pop(data) )
cout data ;
cout \n;
return 0;
}
런타임 에러가 나는 이유가 무엇입니까????
-
메이
SetSize()함수에서만 동작할당을 하는데....
SetSize함수를 쓰는 곳이 없는거 같은데요...
할당된게 없는데 해제 할려고 하니깐 Error가 나는 거 같네요 -
엘보어
저라면, 이렇게 했을거 같습니다. 정답은 아니구요.
Stack s1(5); // -- 요렇게 auto 변수로 쓰는것들있죠.
아래처럼 포인터 형태로 변경해서 함 해보세요. 눈으로 보고 그냥 생각나는대로 적은거라 틀릴수도 있구요.
Stack* p1 = new Stack(5);
...
delete p1;