2017-08-25 5 views
1

TagLibライブラリから大量のデータを読み込み、GoLang(mpeg画像データ)に渡しました。データがフェッチされるのはここ大きな文字ポインタを持つGolang CGO - SEGSERV

である:この時点で

void audiotags_mpeg_artwork(TagLib::MPEG::File *mpegFile, int id) { 
    TagLib::ID3v2::Tag *id3v2 = mpegFile->ID3v2Tag(false); 
    if (id3v2!=nullptr) { 
     const TagLib::ID3v2::FrameList frameList = id3v2->frameListMap()["APIC"]; 
     for(auto it = frameList.begin(); it != frameList.end(); it++) { 
      TagLib::ID3v2::AttachedPictureFrame * frame = (TagLib::ID3v2::AttachedPictureFrame *)(*it); 
      if (frame!=nullptr && frame->size() > 0) { 
       const auto &apicBase64 = frame->picture().toBase64(); 
       auto len = apicBase64.size(); 
       if (len > 0) { 
        // Generate memory for key 
        char* key = new char[5]; 
        memcpy(key, "APIC", 4); 
        key[4]='\0'; 

        // Generate memory for picture data 
        char* val = new char[len]; 
        memcpy (val, apicBase64.data(), len); 

        // Send to GoLang 
        go_map_audiotags(id, key, val); 

        // Free memory 
        delete[] key; 
        delete[] val; 
       } 
      } 
     } 
    } 
} 

、作品(私は他のデータのための類似の方法を使用する)go_map_autotags。これはまた、他の画像データのために働くしかし、サイズに応じて、これはとクラッシュします:GoLang内

unexpected fault address 0x766a000

fatal error: fault

[signal SIGSEGV: segmentation violation code=0x1 addr=0x766a000 pc=0x404530b]

、私は次のエクスポートがあります

//export go_map_audiotags 
func go_map_audiotags(id C.int, key *C.char, val *C.char) { 
    m := maps[int(id)] 
    k := strings.ToLower(C.GoString(key)) 
    log.Println("go_map_audiotags k:", k) // <--- works 
    v := C.GoString(val) // <--- crashes 
    log.Println("go_map_audiotags v:", v) // <--- Does not reach 
    m[k] = v 
} 

を私が輸送されなければならないベティの方法はありますこのデータは? C++はvalに格納されたデータは、NULLで終了ではありませんGoLang

+0

'apicBase64.data()'はヌル終了ですか? – tkausl

+0

@tkauslこれを確認するにはどうすればよいでしょうか? taglibドキュメントによると: フレーム - >絵():http://taglib.org/api/classTagLib_1_1ID3v2_1_1AttachedPictureFrame.html#afd21599ba7fa9a237ec5f1f1cad78e24 ByteVector.data():http://taglib.org/api/classTagLib_1_1ByteVector.html# a55d40ed1e9b9749e3895c845f1f26901 – Stoyvo

+0

Nul-あなた自身で終了し、それでもクラッシュするかどうかを確認してください。 – tkausl

答えて

1

にVを設定する前にメモリをリサイクルし、何らかの理由で、ある)C.char制限が 2に到達していること) 1:私は何が起こっていることであると仮定します。あなたのCコードで、memcpyを使用してコピーを作成すると、ヌルターミネータは含まれません。 Cコードでは、コードを次のように変更します。

// Generate memory for picture data 
char* val = new char[len+1]; 
memcpy (val, apicBase64.data(), len); 
val[len] = '\0'; 
関連する問題