4

VisualStudio2010でgrub-bootableC++カーネルを試してみました。

newとdeleteが書き込まれ、動的に割り当てられた配列などが機能するようになりました。たとえば、STLリストを使用できます。memcpyルーチンを作成した後、それらをソートすることもできます。問題は、std::vectorタイプを使用する場合です。ベクトルを作成するだけで、カーネルがララランドに送られます。

明らかに、ある種の関数の実装が欠けていますが、STLを調べてそれを探し、手ぶらで出てきました。push_backで失敗します:

vector<int> v;
v.push_back(1);

そしてエーテルに消えます。

私が欠けているものについて何か推測はありますか?

はい、それはintのベクトルです。混乱させて申し訳ありません。それだけでなく、失敗するコンストラクターではなく、push_backの呼び出しです。

4

3 に答える 3

6

暗闇の中で突き刺す:あなたは持っていてnew[]delete[]実装していますか?リストは一度に1つのアイテムを作成しますがnew、ベクトルは.を使用してより大きなメモリブロックを割り当てる可能性がありますnew[]

于 2010-08-18T01:24:31.430 に答える
5

上記の説明に従って、

std::vector<mySimpleStruct> v;

の代わりに

std::vector<int> v;

正しく機能しているようです。これは、標準テンプレートライブラリのstd::vectorの一部の関数の特殊化で問題が発生していることを意味しているに違いありません。テンプレートの特殊化についてはすでにご存知だと思いますが、ご存じない場合は次のようにしてください。

http://www.parashift.com/c++-faq-lite/templates.html#faq-35.7

また、本当の問題がどこにあるかを理解したら、戻ってここに答えを投稿できますか?あなたは私に本当の問題が今どこにあるのか興味があります、そしてその答えは彼ら自身のOSカーネルを構築しようとしている他の人に役立つかもしれません。

于 2010-08-18T03:02:08.490 に答える
1

カスタムアロケータを使用しますか、それともデフォルトのアロケータを使用しますか?

カスタムのものを使用して、メモリマネージャの実装を破壊する可能性のある割り当てベクトルのパフォーマンスを確認してみてください(これはおそらく実際に失敗するものです)。

はい、解決したら投稿してください。他のすべてのOSdeverに役立ちます。

于 2010-08-30T22:07:46.143 に答える