私はATLのCComBSTR
タイプを使用するいくつかの古いコードに取り組んでいます。ATLに付属していないVisualC++ExpressEditionを使用してコンパイルされるように変更しています。の非常に小さなサブセットのみを使用したCComBSTR
ので、これを行うのはかなり簡単です。
ただし、BSTR
メモリブロックを割り当てるときは、最初の4バイトを4バイトの長さのプレフィックスで埋める必要があります。new char[size]
式を使用して文字列にメモリを割り当てると、割り当てられたchar
配列に4バイトのプレフィックスの正しい配置がないため、配置エラーが発生するのではないかと心配しています。
の戻り値にどのようなアライメント要件があるかを示す規格に何かありnew
ますか?C++11で表示されるのは次のとおりです。
5.3.4 / 1 [expr.new]
オーバーアラインされたタイプがサポートされているかどうかは、実装によって定義されます(3.11)。3.11 / 6 [basic.align]
完全な型の配置要件は、alignof式(5.3.6)を使用して照会できます。さらに、タイプchar、signed char、およびunsigned charは、最も弱いアライメント要件を持つ必要があります。[注:これにより、文字タイプをアラインされたメモリ領域(7.6.2)の基になるタイプとして使用できるようになります。—end note]
これは少し紛らわしいと思います。「最も弱い位置合わせ要件」は「位置合わせに対する最も厳密な制約がない」と私に言いますが、この下の注記は、標準が反対を意味することを示しているようです。
new char[sizeof(uint32_t) + 2*(length + 1)]
このようにバッファを使用しても安全BSTR
ですか?
編集:この特定のケースではBSTR
、とにかく文字列を割り当てるためにSysAllocStringを使用する必要があることに気づきました。しかし、私はまだnew
このように使用しても大丈夫かどうかに興味があります。