3

newAVR uC 用の C++ コンパイラはand演算子をサポートしていないことがわかりましたdeleteが、簡単な修正方法もあります。

void * operator new(size_t size) 
{ 
  return malloc(size); 
} 

void operator delete(void * ptr) 
{ 
  free(ptr); 
}

を呼び出すことができるようになったと思いますnew ClassName(args);

ただし、これがどのように機能するかはよくわかりません。たとえば、実際にsize_tここで a を返すものは何ですか? コンストラクターは何も返さないと思っていました...

new( と組み合わせてsizeof()) 別の方法で使用されることになっているのでしょうか?

4

2 に答える 2

9

new T(args);ほぼ以下と同等です。

void* storage = operator new(sizeof(T)); // obtain raw storage
call_constructor<T>(storage, args); // make an object in it

(ここでは、コンストラクターcall_constructor呼び出して、そのコンストラクター内のポインターにすることになっています。)Tstoragethis

パーツはoperator new要求された量のrawストレージを取得し、コンストラクター呼び出しは、コンストラクターを呼び出すことによって実際にオブジェクトを作成する呼び出しです。

operator new問題のコードは、パーツ、つまりストレージの取得のみを置き換えます。を使用すると、パートとコンストラクターの両方のsizeof呼び出しがコンパイラーによって自動的に行われますnew T(args)


†この言語には、「配置」と呼ばれるこの直接コンストラクター呼び出しを表現する方法がありますがnew、わかりやすくするために省略しました。

于 2013-01-09T12:34:27.757 に答える
0

コンパイラ名 (uC) から、組み込みコントローラ用であると推測されます。組み込みデバイスで動的メモリ管理を必要とすることはめったにないため、これは理にかなっていますが、「C with classes」の恩恵を受ける可能性があります。C++ を実際に使用できるように、'placement new' がサポートされていることを願っています。

コンパイラが new と delete をサポートしていない場合、それは C++ コンパイラとは言えません。

キーワード「new」は効果的に次のように変換されると思います。

Object* pointer = (Object *)new(sizeof Object);
pointer->Object_Constructor(args);
于 2013-01-09T12:37:25.350 に答える