memory-safety-patterns は何をしますか?
RAII、所有権、スマートポインタ、リソース管理を活用し、Rust、C++、C言語にわたってメモリ安全なプログラミングを実装します。安全なシステムコードの作成、リソース管理、メモリバグの防止に使用します。
概要
このスキルは、メモリ安全性を確保するための設計パターンと実践的なテクニックを提供します。以下の言語における主要な概念をカバーします。
- Rust: 所有権、借用、ライフタイム、
Box、Rc、Arc、RefCellなどのスマートポインタ。 - C++: RAII、
std::unique_ptr、std::shared_ptr、std::weak_ptr、ムーブセマンティクス。 - C: 手動メモリ管理のベストプラクティス(
malloc/freeの安全な使用、所有権のドキュメント化、スコープベースのクリーンアップパターン)。
使用方法
このスキルは、安全なシステムコードを記述する際に、自動的に適用されるか、明示的に呼び出すことができます。例えば、以下のような場合に使用します。
- 新しい関数やデータ構造でメモリ管理が必要な場合。
- 既存のコードにメモリリークや未定義動作の可能性がある場合。
- リソースの所有権とライフタイムを明確にする必要がある場合。
例:Rustでの所有権の適用
struct Config {
data: Vec<u8>,
}
fn process(config: Config) {
// configの所有権がここに移動する
println!("Processing {} bytes", config.data.len());
// スコープ終了時にconfigはドロップされる
}
例:C++でのRAIIとスマートポインタ
#include <memory>
class Resource {
public:
Resource() { /* リソースを取得 */ }
~Resource() { /* リソースを解放 */ }
};
void use_resource() {
auto res = std::make_unique<Resource>();
// スコープ終了時に自動的に解放される
}
例:Cでの安全なメモリ管理
#include <stdlib.h>
#include <string.h>
typedef struct {
char* data;
size_t size;
} Buffer;
Buffer* buffer_create(size_t size) {
Buffer* buf = malloc(sizeof(Buffer));
if (!buf) return NULL;
buf->data = malloc(size);
if (!buf->data) {
free(buf);
return NULL;
}
buf->size = size;
return buf;
}
void buffer_destroy(Buffer* buf) {
if (buf) {
free(buf->data);
free(buf);
}
}
主要なパターン
| パターン | 説明 | 主な言語 |
|---|---|---|
| RAII | リソース取得と解放をオブジェクトのライフタイムにバインド | C++, Rust |
| 所有権 | 各リソースは唯一の所有者を持つ | Rust |
| スマートポインタ | 自動メモリ管理のためのポインタラッパー | C++, Rust |
| 借用 | 所有権を移さずに一時的にアクセス | Rust |
| ライフタイム | 参照の有効期間を静的に検証 | Rust |
| スコープガード | スコープ終了時の自動クリーンアップ | C, C++ |
注意事項
- Rustでは、コンパイラが所有権と借用のルールを強制するため、メモリ安全なコードが保証されます。
- **C++**では、RAIIとスマートポインタを積極的に使用し、生の
new/deleteを避けてください。 - Cでは、リソース管理をドキュメント化し、クリーンアップ関数を一貫して使用することが重要です。
参考リンク
ライセンス
このスキルは、MITライセンスの下で提供されます。