質問
ここに、私が定義したものに似た関数があります:
void Function( BYTE *data );
私がしたいことは次のようなものです:
Function( new BYTE { 0x00, 0x00 } );
解決
new
を使用して動的に割り当てられた配列では、配列初期化構文を使用できません。次のようなことができます:
BYTE *ary=new BYTE[2];
ary[0] = 0;
ary[1] = 0;
Function(ary);
delete [] ary;
しかし、ここで動的に割り当てられたメモリを使用しているのはなぜですか?配列は現在の関数のスコープ外に保持されていますか?そうでない場合は、スタックに割り当てられた配列を使用できます:
BYTE ary[2] = {0};
Function(ary);
C ++では、動的に割り当てられた(ただしタイプセーフな)配列のように動作するSTLクラス std :: vector
を使用する方法が推奨されます:
std::vector<BYTE> ary(2);
Function(&ary[0]);
他のヒント
BYTE foo[] = { 0x00, 0x00 };
Function( foo );
C ++ 0xでは、上記の希望により近いものを許可する初期化リスト構文が導入されます。
#include <windows.h>
#include <iostream>
using namespace std;
void foo(BYTE *d) {
cout << (int)d[ 0 ] << " " << (int)d[ 1 ] << endl;
}
int main(void)
{
foo(new BYTE[ 2 ]());
return 0;
}
上記の方法は、 BYTE
配列をすべてゼロに初期化するだけであれば十分です。 (これはWindowsの BYTE
タイプであると想定しています。)ただし、これは前述のようにリークが発生しやすいため、避けるのが最善です。
または省略記号を使用して配列の作成を模倣することもできます:
これを見てください: http://www.cplusplus.com/ reference / clibrary / cstdarg / va_arg /
0xが到着する前に本当にいじりたい場合は、このコードをご覧ください。
gccには&quot; Compound literals&quot;という拡張子があり、次のように記述できます。
Function((BYTE[]){1, 2, 3, 4});
スタックに割り当てられるため、目的に適さない可能性があることに注意してください。
さて、BYTEがクラスの場合、コンストラクターを作成できます
BYTE::BYTE(char c1,char c2){
//something here.
}
そして電話
Function( new BYTE(0X00,0X00))
ただし、これは漏れやすいです。 Functionを終了する前に引数を削除する必要があります。そして、それは常に可能とは限りません(たとえば、Functionのソースがない場合)
補助機能;
BYTE* makeNaryByteArray( int n, BYTE exemplar = 0 ) {
BYTE* r = new BYTE[ n ];
for( int i = 0 ; i < n ; ++i )
n[i] = exemplar;
return r;
}
//call them:
BYTE* myByteArray;
Function( myByteArray = makeNaryByteArray(2) );
// done with array:
delete[] myByteArray;
覚えておいてください、 new []
で作成された配列は delete []
;