Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > How I free memory and return value from that memory area?

Reply
Thread Tools

How I free memory and return value from that memory area?

 
 
sam
Guest
Posts: n/a
 
      06-25-2003
I am using Sun server which did not have STL. I wrote a small Stack class as
I listed below. If I remove one item from stack and want to free that
memory area. I am using "data" member (temp variable) to hold and return
and deleting original one.
My question is:
How I free memory and return value from that memory area? ( scroll down to
function pop) I did not want to use line 39.
Please comment also over all program. Thank you very much in advance.

#include<iostream>
#include<string>
#include<stdlib>
class Stackitem{
public:
char *item;
Stackitem *next;
};

class Stack{
private:
Stackitem* top;
char* data; // Temp member
public:
Stack();
void push( char *);
char* pop();

};
Stack::Stack() {

data = new char[40];
}
void Stack:ush(char* val1){

Stackitem *st = new Stackitem;
st->item = new char[strlen(val1)+1];
st->item=val1;
top->next=top;
top=st;
}
char* Stack:op(){
Stackitem* t =top;
top = top->next;
strcpy(data,t->item); // Line 39 (I did not want to
use this line. what is the alternative)
delete t;
return t->item;

}
int main(){
Stack *s1 = new Stack();
s1->push("20");
s1->push("30");
s1->push("50");
cout << "pop="<<s1->pop() <<"\n" ;

Stack s2;
s2.push("500");
cout << "pop="<<s2.pop() <<"\n" ;
delete s1;
return (0);
}



 
Reply With Quote
 
 
 
 
Victor Bazarov
Guest
Posts: n/a
 
      06-25-2003
"sam" <(E-Mail Removed)> wrote...
> I am using Sun server which did not have STL. I wrote a small Stack class

as
> I listed below. If I remove one item from stack and want to free that
> memory area. I am using "data" member (temp variable) to hold and return
> and deleting original one.


That's a strange approach. But let's move on...

> My question is:
> How I free memory and return value from that memory area? ( scroll down to
> function pop) I did not want to use line 39.


I don't think that you have a choice given this design.

> Please comment also over all program. Thank you very much in advance.
>
> #include<iostream>
> #include<string>


I don't see you using anything from this header. Why do you need it?
Did you intend to use 'string' instead of 'char*'? What stopped you?

> #include<stdlib>


There is no such header. You probably mean

#include <stdlib.h>

> class Stackitem{
> public:
> char *item;
> Stackitem *next;
> };
>
> class Stack{
> private:
> Stackitem* top;
> char* data; // Temp member
> public:
> Stack();
> void push( char *);
> char* pop();
>
> };
> Stack::Stack() {
>
> data = new char[40];


Are you sure the contents of Stackitem never going to get longer
than 39 symbols? If they do, you're going to experience the wrath
of C++ gods...

> }
> void Stack:ush(char* val1){
>
> Stackitem *st = new Stackitem;
> st->item = new char[strlen(val1)+1];
> st->item=val1;


Here you have a memory leak. You allocate something, get
a value of the pointer into 'st->item', then IMMEDIATELY
overwrite that value with the parameter. Why did you allocate?

Did you mean to _copy_ the contents of 'val1' into 'st->item'?
Then you need to use strcpy.

And, by the way, shouldn't "Stackitem" do the allocation of
its members?

> top->next=top;
> top=st;


This is where you lose the 'next' member you just set.

> }
> char* Stack:op(){
> Stackitem* t =top;
> top = top->next;
> strcpy(data,t->item); // Line 39 (I did not want

to
> use this line. what is the alternative)


No alternative in your case.

> delete t;
> return t->item;


You can't do that. 't' doesn't exist after you 'delete' it.

>
> }
> int main(){
> Stack *s1 = new Stack();
> s1->push("20");
> s1->push("30");
> s1->push("50");
> cout << "pop="<<s1->pop() <<"\n" ;
>
> Stack s2;
> s2.push("500");
> cout << "pop="<<s2.pop() <<"\n" ;
> delete s1;
> return (0);
> }


Awful, overall. You should have used std::string for storage
and really really really need to pay attention to how you link
the elements of the stack (if you decided to use a singly-linked
list for that).

#include <iostream>
#include <string>
using namespace std;

class Stackitem {
string data;
Stackitem *next;
public:
Stackitem(const string& d, Stackitem *n = 0)
: data(d), next(n) {}
string getData() const { return data; }
Stackitem* getNext() const { return next; }
};

class Stack {
Stackitem *top;
int length;
public:
Stack() : top(0), length(0) {}
~Stack() {
while (top) {
Stackitem *p = top->getNext();
delete top;
top = p;
}
}
void push(const string& s) {
top = new Stackitem(s, top);
}
string pop() {
if (!top)
throw "Attempt to pop an empty stack";
string s = top->getData();
Stackitem *n = top->getNext();
delete top;
top = n;
return s;
}
};

int main() {
Stack s1;
s1.push("20");
s1.push("30");
s1.push("50");
cout << "pop=" << s1.pop() << endl;

Stack s2;
s2.push("500");
cout << "pop=" << s2.pop() << endl;

return 0;
}

Victor


 
Reply With Quote
 
 
 
 
Dhruv
Guest
Posts: n/a
 
      06-27-2003
On Wed, 25 Jun 2003 22:36:40 +0000, sam wrote:

> I am using Sun server which did not have STL. I wrote a small Stack class as
> I listed below. If I remove one item from stack and want to free that
> memory area. I am using "data" member (temp variable) to hold and return
> and deleting original one.
> My question is:
> How I free memory and return value from that memory area? ( scroll down to
> function pop) I did not want to use line 39.
> Please comment also over all program. Thank you very much in advance.
>

[major snip here]......

I agree with what victor said.
I'd like to emphasize again USE std::string (But you said that the
std::library was not available for your machine? )

Just as a thought, you could use boost::shared_ptr<>, and your problems
with pop will be solved.

Something like this:

boost::shared_ptr<type> pop (void)
{
boost::shared_ptr<type> temp (actual pointer);
//do relinking of linked list;
//do not do delete pointer;
return temp;
}

Then, in the main (calling) code, write:

shared_ptr<type> t;
t = stack.pop ();

And, when t goes out of scope, or is re-assigned, it will self destruct
(boofff!!!).

HTH,
-Dhruv.


















 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
problem in running a basic code in python 3.3.0 that includes HTML file Satabdi Mukherjee Python 1 04-04-2013 07:48 PM
what value does lack of return or empty "return;" return Greenhorn C Programming 15 03-06-2005 08:19 PM



Advertisments