2016-03-20 16 views
4

この関数の仕事はdataを取り、それを離れて格納することですQByteArrayはそのメモリ(QByteArray :: fromRawData)を所有していることを確認し

void store(const QByteArray& data); 

我々は機能ストアを持っていると言います。残念ながら、その引数がQByteArray::fromRawData(ptr, size)で作成された場合は、それとすべてのコピーでptrが有効である必要があるため、引数を作成した場合は安全ではありません。

したがってstoreは、stereoids上const char*た又はdetachとディープコピーを強制するかのようにdataを治療するために、そのような配列を渡すために、その発信者を禁止するオプションを有していません。これはすべて満足のいくものではなく、特にdataがCOWでコピーされてstoreに渡された場合、不要なディープコピーが実行されるため、後者はパフォーマンスを傷つけます。

QByteArrayprivateの機能を持っていますnulTerminated私の望むことだけを実行するように見える機能:メモリを所有していない場合、それは深いコピーです。メモリを所有していれば、*thisを返すだけです。本当に

  • 二つの質問が回避策public施設を利用しますか?

  • ptrは、戻り値とそのコピーの存続期間中だけ生きていなければならないことを言います。 .right(.size())と言うなら、これはコピーではないようですので、Qtはドキュメントに従って深いコピーを作成する必要があります。しかしそれは本当にそうするのですか?それはあなたのためのソリューションではありませんので(たとえばhere用)のソースを見ると

答えて

2

ba.right(ba.size());は、実際にはほとんど-opの平野浅いコピー、です。どんな場合でも、ドキュメントに裏付けされていない動作に依存することは少し安全ではなく、将来のQtバージョンでは通知なしに変更することができます。

つまり、QByteArray::detach()は文書化されていませんが公開されています。すでに共有されていないデータではなく、fromRawData()で作成されたアレイでディープコピーを実行します。と考えています。デモンストレーション:例えば上記の

QByteArray ba1 = QByteArray::fromRawData("foo", 4); 
QByteArray ba2("foo"); 
qDebug() << (void*)ba1.constData() << (void*)ba2.constData(); 
ba1.detach(); ba2.detach(); 
qDebug() << (void*)ba1.constData() << (void*)ba2.constData(); 

が出力:ソースを見てみると

0x804b960 0x93ebfd8 
0x93d2170 0x93ebfd8 

IS_RAW_DATA macroqbytearray.cppファイルである、と私はあなたどのような方法を発見しませんでしたパブリックインターフェイスを使用してそれを利用することができます。だから、あなたが望むことができないようにするために、detach()があなたが得ることができる最も近いものです。QByteArray::squeeze()は生データを分離しません。

+1

私が理解しているように、 'QByteArray a(" hello "); QByteArray b = a; b.detach(); 'は望ましくない。 –

+0

私はそれを私的アクセスハックでハックし、nulTerminate関数を呼び出す必要があると思います。お疲れ様でした –

関連する問題