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