大まかに言えば、const unsigned char の配列を保持するクラスがあります。このクラスのオブジェクトは、(ヒープ上での) 配列の構築も処理する特別なファクトリ関数によって作成されます。ファクトリ関数でオブジェクトが作成されると、配列へのポインタが与えられます。配列はコピーされず、オブジェクトは指定されたポインターを使用するだけです。破棄すると、配列が占有していたメモリのチャンクの割り当てが解除されます。
class Foo
{
private:
const unsigned char* array;
size_t size;
public:
Foo(const unsigned char* array, size_t size) : array(array), size(size) {}
~Foo() {delete [] array;}
};
Foo* factoryFunction(const void* data, size_t size)
{
unsigned char* array = new unsigned char[size];
memcpy(array, data, size);
return new Foo(array, size);
}
new []
を返すため、副作用があるかどうか疑問に思いますunsigned char *
が、delete []
が呼び出されconst unsigned char *
ます。ただし、セグメンテーション違反は発生しません。