![]() |
|
![]() |
|
|
Thread Tools | Display Modes |
|
|
#1 |
|
Hobbyist Programmer
Join Date: Jan 2006
Location: Menidi, Athens, Greece
Posts: 239
Rep Power: 3
![]() |
Stadard C i/o problems with C++ classes
I am trying to write some code that saves the contents of a C++ class in a file. So, I am experimenting with some C and C++ i/o code, but I am stuck in some things...
Lets say I have the following code: cpp Syntax (Toggle Plain Text)
The error I get when I run this code is: SoulFramework(1211) malloc: *** Deallocation of a pointer not malloced: 0x3007d0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug SoulFramework(1211) malloc: *** Deallocation of a pointer not malloced: 0x300790; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug However, if I use character arrays or something like integers in the struct, the code works just fine. 1)Why? Does that have something to do with classes like std::string and vector that are dynamic? 2)If I definitely want to use those classes with standard C i/o what should I do? 3)If I decide to use C++ i/o, what can I do to store the elements of a class like a vector<customStruct> inside a file? The contents of the customStruct could be integers, floats, or std::strings. EDIT: To make myself clear: I have a class, that occupies some memory. Is there any way to save this memory piece into a (binary?) file and then load it the same way? I suppose the file would be unreadable by a text editor, this way.
__________________
Project::Soulstorm (personal homepage) Last edited by Soulstorm; Jul 13th, 2007 at 12:27 PM. |
|
|
|
|
|
#2 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
Don't mix new with free. Free is for use with malloc. Delete is for use with new.
I would use C++ file I/O and write a serialize method for the class (overload the << operator, for instance).
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#3 | |
|
Hobbyist Programmer
Join Date: Jan 2006
Location: Menidi, Athens, Greece
Posts: 239
Rep Power: 3
![]() |
Quote:
But as stupid as it may sound, my question remains. Why am I getting these errors? As for your solution... Do you mean I should write a class, overload the << operator for this class and output the result in a stream? Ok, let's say I do this, how do I read them back from the file? Using the >> operator in the same order I have written the data in the first place?
__________________
Project::Soulstorm (personal homepage) |
|
|
|
|
|
|
#4 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
1) You're getting the errors (the only ones you mention in your post) because the pointer returned by new is not a valid pointer for free. Again, use delete.
2) Yup. The problem with writing the structure out en masse is that padding bytes may or may not be present with different compilers run on different systems. It's a portability issue.
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#5 | |
|
Hobbyist Programmer
Join Date: Jan 2006
Location: Menidi, Athens, Greece
Posts: 239
Rep Power: 3
![]() |
Thanks a lot, Dawei. But:
Quote:
cpp Syntax (Toggle Plain Text)
Result: [Session started at 2007-07-14 12:58:33 +0300.] SoulFramework(396) malloc: *** Deallocation of a pointer not malloced: 0x3007e0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug SoulFramework(396) malloc: *** Deallocation of a pointer not malloced: 0x3007a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug hello fourth!!! SoulFramework has exited with status 0. Maybe I'm missing something... I think I mentioned that using 'delete' has the same result.
__________________
Project::Soulstorm (personal homepage) |
|
|
|
|
|
|
#6 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
The vector in kkk holds strings allocated on the heap, which are referred by pointers. What you are storing in the file are the pointers. When you delete kkk, you are deleting the information. The pointers become invalid. When you read the file, you put these invalid pointers in lll. When they get dereferenced during the cout, el puko on el shoes.
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#7 |
|
Hobbyist Programmer
Join Date: Jan 2006
Location: Menidi, Athens, Greece
Posts: 239
Rep Power: 3
![]() |
I see. Thanks Dawei, it makes much more sense now. Seems to me that the best method is to use classes with overloaded operators to do the hard work.
__________________
Project::Soulstorm (personal homepage) |
|
|
|
|
|
#8 |
|
Resident Grouch
![]() ![]() ![]() ![]() ![]() ![]() Join Date: Jun 2005
Posts: 6,453
Rep Power: 10
![]() |
Yeah. It's a matter of shallow copy versus deep copy. You'd have the same problem if you instantiated lll and assigned kkk to it. When kkk went away, it'd be bogus. You'd need to write a copy constructor and make a deep copy.
__________________
Abstraction doesn't make it impossible to write bad code; it makes it possible to write superior code. Contributor's Corner: Grumpy on C++ Exceptions DaWei on Pointers |
|
|
|
|
|
#9 |
|
Programming Guru
![]() Join Date: Jun 2005
Location: Adelaide, South Australia
Posts: 1,207
Rep Power: 5
![]() |
Yup; it's an issue of deep versus shallow copy.
Another description is that use of fread()/fwrite() and C++ classes often don't mix. A common case where they definitely don't mix are when the C++ classes involved have a non-default copy constructor (which allocate resources, etc). Your TestStruct contains two std::strings and a vector of std::strings, which means it contains multiple objects with non-default copy constructors (std::string has a non-default copy constructor, and std::vector<anything> has a non-default copy constructor, as both strings and vectors dynamically manage memory). Non-default copy constructors, in practice, are usually associated with non-default assignment operators. If you write such objects out with fwrite() and read them in again with fread(), then you are unlikely to get the original object back in good shape. The error messages about no deallocation of malloc()'ed memory is one potential consequence of that. |
|
|
|
![]() |
| Bookmarks |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Could some please explain classes to me... | TCStyle | C++ | 10 | Feb 20th, 2006 3:51 PM |
| What is Lightweight C++? difference in inner classes between C++ and Java? | jonyzz | C++ | 4 | Sep 2nd, 2005 9:56 AM |
| List of classes | Dark_Shinobi | C++ | 8 | May 23rd, 2005 3:50 PM |
| Classes | Sane | Python | 8 | Apr 29th, 2005 12:50 PM |
| C++ Classes - Quick question(s) | Delete | C++ | 8 | Apr 7th, 2005 7:38 PM |