あなたが何を意味するかに依存します。あなたがポインタを持っているときはいつでも、それを呼び出すことが可能delete
です。
そして、あなたが参照を持っているなら、あなたはあなたにポインタを与えるそのアドレスを取ることができます
とにかく、たとえばこのクラスがある場合:
class X {
int getByVal() { return i; } // returns a copy of i
int& getByRef() { return i; } // returns a reference to i
private:
int i;
};
それなら、私はあなたのクラスのユーザーとして、あなたのデータを削除する明白な方法を持っていません。私は次のことができます:
X x;
int j = x.getByVal();
int& k = x.getByRef();
j = 42; // doesn't affect x.i because we returned a copy
k = 42; // sets x.i to 42, because k is a reference
そして、クラスのメンバーを削除する明確な方法はありません。もちろん、私はこれを行うことができます:
delete &j;
delete &k;
(そしてもちろん、これらはどちらも意味のあることは何もしませんが、コンパイルします)しかし、私は偶然にそうしませんでした。ポインタを返さない場合は、私がデータの所有権を取得することになっていないことは明らかです。
「マキャベリではなく、マーフィーからコードを保護する」というのは、通常、経験則として適切です。彼らが試みた場合、人々があなたのコードを破壊するのを防ぐことはできません。あなたが心配しなければならないのは、彼らが誤ってそれをするのを防ぐことだけです。
質問の下のコメントに応じて編集
します。
私が言ったように、私は学んでいます...コピーは、呼び出し先が戻り変数のメモリを解放しなければならないと考えさせます。これは、呼び出し先にとってより厄介です(それが私= pであるとしても)ので、私は概念について話していませんでした、しかし書くことの容易さ...そして繰り返しますが、私はこの記憶に関するものの初心者です。私はC#、PHPなどで開発していました。CircleMUDで学んでいたとき、ずっと前にCで開発していました。
いいえ、コピーを手動で削除する必要はありません。ローカル変数は、スコープ外になると自動的に削除されます。したがって、上記の例でj
は、はクラスメンバーのコピーですi
。呼び出し元の関数が戻ると、j
は自動的に削除されます。
お役に立てば幸いです。C ++の可変ライフタイムルールはそれほど複雑ではありませんが、多くのコードがそれらに依存しているため、それらを正しくすることが非常に重要です。
void foo()
{
int i = 0; // allocate a local (on the stack) int, and initialize it to 0
int* p = new int(1); // allocate an int on the heap, and initialize it to 1
int j = i; // create a *copy* of i. Now we have two ints on the stack
int k = *p; // create a copy of the int pointed to by p. k is also on the stack, so even though it was copied from a heap-allocated variable, k does not have to be manually deleted
int* q = p; // create a copy of p. q is not a separate pointer, which points to the *same* heap-allocated integer.
}
上記の例では、戻ったときにすべてのコピーが自動的にクリーンアップされfoo
ます。手動で行う必要があるのは、ヒープに割り当てた整数を削除することだけです。両方ともp
それをq
指しますが、オブジェクトを削除する必要があるのは1回だけです。ただし、、、、、およびはすべてローカル変数であり、スタックで宣言されていi
ます。関数が戻ると、それぞれがクリーンアップされます。プリミティブ型(sやポインターなど)の場合、実際には何も発生する必要はありません(デストラクタはありません)。スコープから外れると、整数などのヒープに割り当てられたオブジェクトなど、重要なものを指していても、消えてしまいます。j
k
p
q
int
非PODオブジェクトの場合、スコープ外になるとデストラクタが呼び出されるため、それらもすべて単独で適切にクリーンアップされます。したがって、より複雑なタイプを使用したとしてもint
、上記は問題なく機能します。非PODオブジェクトをコピーして、値で渡すこともできます。
それが物事を少しクリアするのに役立つことを願っています。