あなたがこのようなものを持っているなら:
class Foo
{
public:
int* block;
Foo()
{
block = new int[10];
}
private:
Foo(const Foo&);
Foo& operator =(const Foo&);
};
その後、これを行います。
Foo* foo = new Foo;
delete foo;
そうです、あなたはメモリリークを起こしているのです。Fooオブジェクトの動的ブロックが解放されることはありません。これを解放するデストラクタを使用してこれに対処できます。(ソースの場合、クラス宣言でもデストラクタを宣言する必要があります):
Foo::~Foo()
{
delete [] block;
}
2つのことをすることをお勧めします
- 削除と新規をカウントします。それらが同じでない場合、それは一般的に問題です。
- C++での動的ポインタとメモリ使用量に関するこの有益なドキュメントをお読みください。
#2に続いて、ところで、これに似たオブジェクトが得られる可能性があります。
class Foo
{
public:
std::array<int,10> block;
Foo() // note: default-construction of `block`
{
}
// note: default *destructor* will clean up member variables
// by firing their destructors for you. in this case the destructor
// for our 'block' member is a std::array that knows how to self-clean.
// note: we no longer have to hide or implement copy construction and
// assignment operator functionality. The default implementation of
// these properly member-copy and member-assign respectively.
};
そして、このような使用法(多くの可能性の1つ):
std::unique_ptr<Foo> foo(new Foo);
最後の例のソースにあるメモを考慮してください。自己管理メンバーを練習するクラスを使用することにより、メモリ管理の肩から大きな重みが取り除かれます。その重みを持ち上げると、メモリリーク、浅いコピーの危険など、それに関連するバグが発生する可能性も高くなります。