about using frameListMap

Roel roel_v at stack.be
Sat May 6 12:47:17 CEST 2006


Sorry for replying to myself and the list clutter, but I can't reproduce 
it anymore when I link TagLib statically. Must be something with 
allocating memory outside a dll and freeing it inside or something like 
that. Because it was so similar to Dave's problem, I was looking in the 
wrong direction.


cheers,

roel



Roel wrote:
> Hi,
> 
> I have a problem that looks like it's the same as the one Dave Wiard 
> wrote to this list about on 7th of April.
> I narrowed it down to this program:
> 
> #include <tag.h>
> #include <mpegfile.h>
> #include <id3v2tag.h>
> 
> int main(int argc, char* argv[])
> {
> 	TagLib::MPEG::File file("test.mp3");
> 
> 	TagLib::ID3v2::Tag* id3v2 = file.ID3v2Tag();
> 
> 	TagLib::ID3v2::FrameList l = id3v2->frameListMap()["APIC"];
> 
> 	return 0;
> }
> 
> When this program exits, it tries to deallocate 'file' when unwinding 
> the stack. I get a crash as shown in the following stack trace (the 
> first couple of lines basically mean that the pointer that was passed to 
> the delete operator is not a valid pointer, usually memory that has been 
> freed already):
> 
> 
>> 	ntdll.dll!7c901230() 	
>> 	ntdll.dll!7c96c943() 	
>> 	ntdll.dll!7c96cd80() 	
>> 	ntdll.dll!7c960af8() 	
>> 	kernel32.dll!7c85e7af() 	
>> 	TagLibd.dll!_CrtIsValidHeapPointer(const void * pUserData=0x00343e30)  Line 1807	C
>> 	TagLibd.dll!_free_dbg(void * pUserData=0x00343e30, int nBlockUse=1)  Line 1132 + 0x9	C
>> 	TagLibd.dll!operator delete(void * pUserData=0x00343e30)  Line 54 + 0x10	C++
>> 	TagLibd.dll!std::allocator<std::_List_nod<TagLib::ID3v2::Frame *,std::allocator<TagLib::ID3v2::Frame *> >::_Node>::deallocate(std::_List_nod<TagLib::ID3v2::Frame *,std::allocator<TagLib::ID3v2::Frame *> >::_Node * _Ptr=0x00343e30, unsigned int __formal=1)  Line 132 + 0x9	C++
>> 	TagLibd.dll!std::list<TagLib::ID3v2::Frame *,std::allocator<TagLib::ID3v2::Frame *> >::_Tidy()  Line 934	C++
>> 	TagLibd.dll!std::list<TagLib::ID3v2::Frame *,std::allocator<TagLib::ID3v2::Frame *> >::~list<TagLib::ID3v2::Frame *,std::allocator<TagLib::ID3v2::Frame *> >()  Line 366	C++
>>
>>>	TagLibd.dll!TagLib::List<TagLib::ID3v2::Frame *>::ListPrivate<TagLib::ID3v2::Frame *>::~ListPrivate<TagLib::ID3v2::Frame *>()  Line 71 + 0x12	C++
>>
>> 	TagLibd.dll!TagLib::List<TagLib::ID3v2::Frame *>::ListPrivate<TagLib::ID3v2::Frame *>::`scalar deleting destructor'()  + 0x2b	C++
>> 	TagLibd.dll!TagLib::List<TagLib::ID3v2::Frame *>::~List<TagLib::ID3v2::Frame *>()  Line 103 + 0x2e	C++
>> 	TagLibd.dll!std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> >::~pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> >()  + 0x4a	C++
>> 	TagLibd.dll!std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node::~_Node()  + 0x2e	C++
>> 	TagLibd.dll!std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node::`scalar deleting destructor'()  + 0x2b	C++
>> 	TagLibd.dll!std::_Destroy<std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node>(std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node * _Ptr=0x00343e78)  Line 50	C++
>> 	TagLibd.dll!std::allocator<std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node>::destroy(std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node * _Ptr=0x00343e78)  Line 152 + 0x9	C++
>> 	TagLibd.dll!std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Erase(std::_Tree_nod<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Node * _Rootnode=0x00343e78)  Line 896	C++
>> 	TagLibd.dll!std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::clear()  Line 782	C++
>> 	TagLibd.dll!std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::erase(std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::iterator _First={...}, std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::iterator _Last={...})  Line 754	C++
>> 	TagLibd.dll!std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::_Tidy()  Line 1144	C++
>> 	TagLibd.dll!std::_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >::~_Tree<std::_Tmap_traits<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > >,0> >()  Line 393	C++
>> 	TagLibd.dll!std::map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > > >::~map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *>,std::less<TagLib::ByteVector>,std::allocator<std::pair<TagLib::ByteVector const ,TagLib::List<TagLib::ID3v2::Frame *> > > >()  + 0x2b	C++
>> 	TagLibd.dll!TagLib::Map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >::MapPrivate<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >::~MapPrivate<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >()  + 0x2e	C++
>> 	TagLibd.dll!TagLib::Map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >::MapPrivate<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >::`scalar deleting destructor'()  + 0x2b	C++
>> 	TagLibd.dll!TagLib::Map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >::~Map<TagLib::ByteVector,TagLib::List<TagLib::ID3v2::Frame *> >()  Line 54 + 0x2e	C++
>> 	TagLibd.dll!TagLib::ID3v2::Tag::TagPrivate::~TagPrivate()  Line 49 + 0x1e	C++
>> 	TagLibd.dll!TagLib::ID3v2::Tag::TagPrivate::`scalar deleting destructor'()  + 0x2b	C++
>> 	TagLibd.dll!TagLib::ID3v2::Tag::~Tag()  Line 89 + 0x2e	C++
>> 	TagLibd.dll!TagLib::ID3v2::Tag::`vector deleting destructor'()  + 0x69	C++
>> 	TagLibd.dll!TagLib::MPEG::File::FilePrivate::~FilePrivate()  Line 189 + 0x35	C++
>> 	TagLibd.dll!TagLib::MPEG::File::FilePrivate::`scalar deleting destructor'()  + 0x2b	C++
>> 	TagLibd.dll!TagLib::MPEG::File::~File()  Line 246 + 0x2e	C++
>> 	taglibtest.exe!main(int argc=1, char * * argv=0x003418f0)  Line 18 + 0x28	C++
>> 	taglibtest.exe!mainCRTStartup()  Line 259 + 0x19	C
>> 	kernel32.dll!7c816d4f() 	
>> 	ntdll.dll!7c915b4f() 	
>> 	kernel32.dll!7c8399f3() 	
> 
> 
> 
> 
> As you can see it's on Windows. The test file used didn't contain any 
> "APIC" frames, which seems to be important - it's no problem when I use 
> a file that has 1 or more of those frames.
> The problems seem to start in
> 
>    ~ListPrivate() {
>      clear();
>    }
> 
> in tlist.tcc.
> 
> Can anyone confirm this problem exists on non-Windows platforms? Am I 
> doing something wrong or is there some problem somewhere with the list 
> handling in TagLib? Thanks.
> 
> 
> cheers,
> 
> roel
> 
> _______________________________________________
> taglib-devel mailing list
> taglib-devel at kde.org
> https://mail.kde.org/mailman/listinfo/taglib-devel
> 
> 
> 



More information about the taglib-devel mailing list