C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
sam
Guest





PostPosted: Wed Jun 25, 2003 10:36 pm    Post subject: How I free memory and return value from that memory area? Reply with quote



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::push(char* val1){

Stackitem *st = new Stackitem;
st->item = new char[strlen(val1)+1];
st->item=val1;
top->next=top;
top=st;
}
char* Stack::pop(){
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="<
Stack s2;
s2.push("500");
cout << "pop="< delete s1;
return (0);
}



Back to top
Victor Bazarov
Guest





PostPosted: Wed Jun 25, 2003 11:07 pm    Post subject: Re: How I free memory and return value from that memory area Reply with quote



"sam" <sampal (AT) nc (DOT) rr.com> wrote...
Quote:
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...

Quote:
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.

Quote:
Please comment also over all program. Thank you very much in advance.

#include<iostream
#include

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?

Quote:
#include

There is no such header. You probably mean

#include
Quote:
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...

Quote:
}
void Stack::push(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?

Quote:
top->next=top;
top=st;

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

Quote:
}
char* Stack::pop(){
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.

Quote:
delete t;
return t->item;

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

Quote:

}
int main(){
Stack *s1 = new Stack();
s1->push("20");
s1->push("30");
s1->push("50");
cout << "pop="<
Stack s2;
s2.push("500");
cout << "pop="< 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 #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



Back to top
Dhruv
Guest





PostPosted: Fri Jun 27, 2003 1:29 pm    Post subject: Re: How I free memory and return value from that memory area Reply with quote



On Wed, 25 Jun 2003 22:36:40 +0000, sam wrote:

Quote:
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.



















Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.