将文档添加到Lucene索引会导致崩溃

时间:2010-06-30 15:07:36

标签: c++ lucene iteration taglib clucene

我正在尝试使用一个ID3帧索引一个mp3文件。使用CLucene和TagLib。以下代码工作正常:

...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
    TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
    lucene::document::Document *document = new lucene::document::Document;
    TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin();
    std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
    const wchar_t *fieldName = field_name.c_str();
    const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
    lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
    document->add(field);
    writer->addDocument(document);
}
...

但是这个会导致应用程序崩溃:

...
TagLib::MPEG::File file("/home/user/Depeche Mode - Personal Jesus.mp3");
if (file.ID3v2Tag()) {
    TagLib::ID3v2::FrameList frameList = file.ID3v2Tag()->frameList();
    lucene::document::Document *document = new lucene::document::Document;
    for (TagLib::ID3v2::FrameList::ConstIterator frame = frameList.begin(); frame != frameList.end(); frame++) {
            std::wstring field_name((*frame)->frameID().begin(), (*frame)->frameID().end());
            const wchar_t *fieldName = field_name.c_str();
            const wchar_t *fieldValue = (*frame)->toString().toWString().c_str();
            lucene::document::Field field(fieldName, fieldValue, true, true, true, false);
            document->add(field);
    }
    writer->addDocument(document);
}
...

为什么?!

2 个答案:

答案 0 :(得分:2)

这是一个范围问题 - 当您调用writer-> addDocument时,您添加到其中的字段将被释放。请改用此代码:

document->add(* new lucene::document::Field(fieldName, fieldValue, true, true, true, false));

您可能需要查看cl_demo和cl_test以查看一些代码示例。

答案 1 :(得分:0)

您是否需要为要添加的每个标记构建一个新的lucene :: document :: Field?看起来你正在重复使用相同的地址,这是有问题的。我想调试器可以告诉你更多。