Reputation: 10870
So, I'm kind of a beginner at C++ ... I thought I had a firm grasp of dynamic memory allocation but I guess I don't. I've searched the net for numerous solutions but I still cannot fix my problem. I keep getting error 0xC00000FD:Stack overflow when I run debug. I'm pretty sure the problem has to do with the way I'm allocating memory in the default constructors but maybe it's something else. I guess I need some deeper insight. Any help or hint in determining the problem would be greatly appreciated.
It's a simple program to calculate area and perimeter of a rectangle from user input.
This is the header file:
#pragma once
class my_Rectangle
{
private:
float m_area;
float m_perimeter;
float m_length;
float m_width;
void update_rec();
my_Rectangle*tempSTORE;
public:
float calc_area(float length,float width);
float calc_perim(float length,float width);
void change_RECTsize(float length,float width,my_Rectangle tempSTORE);
my_Rectangle(); //constructor
my_Rectangle(float length,float width);
~my_Rectangle(); //destructor
};
This is the class member definitons file:
#include "StdAfx.h"
#include "my_Rectangle.h"
#include <iostream>
//using namespace std;
//This function calculates the area
float my_Rectangle::calc_area(float length,float width)
{
float area = width * length;
std::cout<<"\nThe area of the rectangle is: "<<area<<" square metres."<<std::endl; // ::scope operater
return area;
}
//This function calculates the perimeter
float my_Rectangle::calc_perim(float length,float width)
{
float perimeter=(2*length)+(2*width);
std::cout<<"\nThe perimeter of the rectangle is "<<perimeter<<" metres."<<std::endl;
return perimeter;
}
//this function changes the size of the rectangle
void my_Rectangle::change_RECTsize(float length,float width,my_Rectangle tempSTORE)
{
tempSTORE.m_length=length;
tempSTORE.m_width=width;
my_Rectangle::calc_area(length,width);
my_Rectangle::calc_perim(length,width);
}
my_Rectangle::my_Rectangle() //default constructor
{
tempSTORE=new my_Rectangle;
tempSTORE->m_length=0.00;
tempSTORE->m_width=0.00;
tempSTORE->m_area=0.00;
tempSTORE->m_perimeter=0.00;
}
my_Rectangle::my_Rectangle(float length,float width) //initialized constructor
{
tempSTORE=new my_Rectangle;
tempSTORE->m_length=length;
tempSTORE->m_width=width;
calc_area(length,width);
calc_perim(length,width);
}
my_Rectangle::~my_Rectangle() //destructor
{
delete tempSTORE;
std::cout<<"\nThe memory has been freed!!"<<std::endl;
And this is the client file:
#include "stdafx.h"
#include "my_Rectangle.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
float xlength,xwidth;
cout<<"Welcome to the rectangle Area Calculator!"<<endl;
cout<<"Please enter the length and width of your rectangle:"<<endl;
cout<<"Length: "; cin>>xlength;
cout<<"Width: "; cin>>xwidth;
cout<<"Rectangle Information:"<<endl;
cout<<"Length: "<<xlength<<"m\tWidth: "<<xwidth<<" m"<<endl;
my_Rectangle userRECT(xlength,xwidth);
reTRY:
int user_choice;
cout<<"More options:"<<endl;
cout<<"1. Change rectangle size"<<endl;
cout<<"2. Exit"<<endl;
cout<<"Enter a number: ";
cin>>user_choice;
switch (user_choice)
{
case 1:
cout<<"Please enter the new length and width of rectangle:"<<endl;
cout<<"Length: "; cin>>xlength;
cout<<"Width: "; cin>>xwidth;
cout<<"\nRectangle Information:"<<endl;
cout<<"Length: "<<xlength<<"m\tWidth: "<<xwidth<<" m"<<endl;
userRECT.change_RECTsize(xlength,xwidth,userRECT);
break;
case 2:
exit(1);
break;
default: cout<<"\nThat is not a valid option. Please try again!" ;
goto reTRY;
break;
}
cin.get();cin.get();
return 0;
}
Upvotes: 3
Views: 5788
Reputation: 171117
Stack overflows have little to do with dynamic allocation - the stack is for function calls and local variables (static & automatic allocation). But you do have infinite recursion in your default constructor:
my_Rectangle::my_Rectangle() //default constructor
{
tempSTORE=new my_Rectangle;
This will allocate tempSTORE
and call the default constructor on it, which will allocate a tempSTORE
, which ...
You seem to be confused about the order of memory and construction operations. Constructors and destructors run on memory already allocated by someone else. The sequence is as follows:
new
)delete
)This means your constructor should not be concerned about obtaining memory for the object it's constructing, it's been already provided by someone. Neither should the destructor care about releasing memory occupied by the object itself, that will be done by someone else once the destructor ends.
To learn more about this, I suggest you follow a good book.
Upvotes: 9
Reputation: 254431
my_Rectangle::my_Rectangle() //default constructor
{
tempSTORE=new my_Rectangle;
There's the problem - new my_Rectangle
calls this constructor, falling into a recursive death spiral as it tries to create an infinite chain of rectangles.
I've no idea how to fix it, since I've no idea what tempSTORE
is supposed to be. You seem to be writing random values into it, and never reading them back - it doesn't look like it should exist at all. In any case, you certainly can't create it in this manner in this place.
Upvotes: 3