他の人が指摘しているように、void
には定義されたサイズがありません。は配列として索引付けできません。
temp[1]
はどこから始まりますか?
のナイーブ修正:
コードは代入演算子を呼び出し、非自明かどうだろう
temp[i] = std::move(array[i]);
:
T *temp = std::malloc((end-begin) * sizeof(T));
はと組み合わせて使用する場合と同じように悪いですごみに作用するときには失敗する。それはtemp[i]
にある。たとえば、割り当てが明示的または暗黙的に割り当て先のリソースを割り当て解除すると、初期化されていないtemp[i]
で動作し、失敗します。
If(IF!
std::memcpy(temp+i*sizeof(i),array[I],sizeof(T));
コードの行は、本質的にT
は自明-コピー可能タイプであると仮定されていること:)あなたは正しいコードは次のようになり、これをやりました。
最初の行は、オブジェクトがT
であると仮定していますが、デフォルトのコンストラクタは簡単です。 T
に些細なデフォルトのコンストラクタがある場合、ほとんどのコンパイラは要素の初期化を離れて最適化します(これは、アスカーが避けようとしているものです)。
ので(for
ループを使用して)お勧めのコードは次のとおりです。
T* temp= new T[end-being];
for(unsigned int i=begin;i<end;++i){
temp[i-begin]=array[i];
}
NB:このコードはまた、begin!=0
壊れ元のコードのバグが修正されています。 array
の中間からサブセクションをコピーして、temp
の先頭にコードがコピーされているように見えますが、0
がtemp
で始まることを忘れてしまいます。
しかし、そのようなコピーを推奨C++のアプローチは、次のとおりです。
T* temp= new T[end-being];
std::copy(array+begin,array+end,temp);
良い実装が決定し、可能な場合は任意のバルクメモリ操作を利用します。 有効であれば暗黙的にこれはstd::memmove(temp,array,(end-begin)*sizeof(T));
になるはずです。コンパイラが認識しない場合があります
唯一の最後のねじれは、我々は、範囲ビーイングおろか(temp
がarray
と重複することはできません知っているので、潜在的に、もう少し効率的
std::memcpy(temp,array,(end-begin)*sizeof(T));
、この場合には、実際に有効であるということですコピー)。
脚注:コメントで指摘したように、最も一般的なC++のアプローチは、これらの最適化をバックグラウンドで使用していると通常想定できるstd::vector
を使用することです。しかし、何らかの理由でアプリケーションを再構築することが不可能または望ましくない場合、この回答は、提供されたコードを書き直す有効な効率的な方法を提供します。
Wow、C++ 11のタグ付きの生のmallocを使用していますか? –
デバッグのヘルプ( "**なぜこのコードは動作しないのですか?**")は、 必要な動作、特定の問題またはエラー、最短のコードを含める必要があります**質問自体に** を再現する必要があります。 。 **明確な問題のない質問 ステートメント**は、他の読者には役に立ちません。参照:[最小、完全、および 検証可能な例の作成方法](http://stackoverflow.com/help/mcve) –
*プレースメントnew *をご覧ください。 – Jarod42