No.7ベストアンサー
- 回答日時:
デストラクタにとって「いかなる理由で呼び出されたのか」を知る方法はありません. 従って「明示的にデストラクタを呼び出しても問題なく, かつ (スコープの外に出るなどの理由で) インスタンスを*本当に*破棄したいときには*その場で*メモリを解放する」などという都合のよい方法は存在しません.
「必要もないのに明示的にデストラクタを呼び出す」ようなやつにはちゃんとした躾をすべきなのです.
回答ありがとうございます
都合のよい方法はないのですね
別の対処方法を考えてみようと思います
> 「必要もないのに明示的にデストラクタを呼び出す」ようなやつにはちゃんとした躾をすべきなのです.
本当にその通りだと思います
ただし、躾けるべき相手がお金を払ってくれる立場にいると
なかなかうまくいかないものですが、、、
No.8
- 回答日時:
>明示的にデストラクタが呼ばれてしまった場合でも
>リカバリーできるようにしたいのです
そもそも明示的にデストラクタを呼び出した後、デストラクタを含めインスタンスメソッドが正常に呼び出される保証がありませんけど。
#2で既に書いてますけど明示的にデストラクタを呼び出したことによってインスタンスの残骸にしてしまったものに、いったい何を期待してるんですか?
インスタンスの残骸にインスタンスとして動くように期待しても、それは無理です。
No.6
- 回答日時:
まず, 「明示的にデストラクタを呼び出したあとで『ふつう』に (= 『ふつうならデストラクタを実行するような方法』で) スコープ外に出る」のは未定義動作. で形のうえでは, 自動変数に対して明示的にデストラクタを呼び出したとしても placement new を使えばいけるような気はするけど, やったことないからなぁ... というか, 自動変数に明示的にデストラクタを呼び出すなんて, やろうと思ったことがないなぁ. 必要性も思い付かんし.
そもそも, どうして「明示的にデストラクタを呼び出す」必要があるんでしょうか?
回答ありがとうございます
明示的にデストラクタを呼びだす必要があるというより
明示的にデストラクタが呼び出されることがあっても
プログラムが不正な状態にならない(エラーを返すのは良い)ようにしたいのです
エラーを返すだけならサンプルコードを例にすれば
すべてのメソッドにおいてm_aがNULLでないことを確認すればよいかもしれませんが
エラーを返さなくてよい方法を探していました
No.5
- 回答日時:
>では、明示的にデストラクタを呼んだ後
>使用したい場合はcreateなどのコンストラクタに相当するような機能を用意しておき
>使用する側はそれで初期化することが必要なのでしょうか
明示的にデストラクタを呼ぶケースは、placement newを使用したときのためのものですから、#1のお礼に書いてあるようなする事が間違いです。
No.4
- 回答日時:
インスタンスが破棄される時にデストラクタが呼ばれる仕様となっています。
インスタンス破棄 と デストラクタを呼ぶ は同じ事ですね。
つまり、
「デストラクタが呼ばれた際に解放されてしまい、インスタンスが破棄されるまで使用できませんでした」
という文章は、
「インスタンスが破棄された際に解放されてしまい、インスタンスが破棄されるまで使用できませんでした」
となっていて、自明となります。
もしかして、プログラム終了まで動的に確保したメモリを使いたいということでしょうか?
そうだとすれば、Formのクローズイベントなどで処理すればいいかもしれないです。
もしくは、「ある特定のインスタンスで動的に確保したメモリを他のインスタンスでも使用しているので、全ての参照がなくなったら破棄したい」という事なら、参照カウントを用意して、デストラクタが呼ばれた際にデクリメントしていって、参照が無くなった時に解法する方法も考えられます。
No.3
- 回答日時:
#2です。
補足しておきますが明示的にデストラクタを呼んだ場合は、インスタンスに必要なメモリが確保されてるだけの状態であってインスタンスとしては破棄済みです(だから#2では「インスタンスの残骸」と書いてる)。
回答ありがとうございます
> インスタンスに必要なメモリが確保されてるだけの状態であってインスタンスとしては破棄済みです
なるほど。
では、明示的にデストラクタを呼んだ後
使用したい場合はcreateなどのコンストラクタに相当するような機能を用意しておき
使用する側はそれで初期化することが必要なのでしょうか
No.1
- 回答日時:
なにをいっているのかがわからない. 具体的にはどんなコードでどんな不具合があるの?
回答ありがとうございます
例えば以下のような、コンストラクタでメモリを割り当て
デストラクタでメモリを解放するクラスがあるとします
class Tile
{
public:
Tile() : m_a(NULL) { m_a = new int; }
~Tile() { delete m_a; m_a = NULL; }
void set(int value) { *m_a = value; }
int get() const { return *m_a; }
private:
int* m_a;
};
このクラスのインスタンスを生成して使用する際、
明示的にデストラクタが呼び出されると、
インスタンスが破棄されていなくても使用できなくなります。
void use()
{
{
Tile tile;
tile.set(10);
printf("%d\n", tile.get());
tile.~Tile(); // 明示的なデストラクタ呼び出し。
tile.set(10); // 動作しない
printf("%d\n", tile.get()); // 動作しない
} // ここでインスタンスが破棄され、2回目のデストラクタが呼び出される。
}
デストラクタが呼び出された時ではなく、
インスタンスが破棄されたときにメモリを解放するにはどうしたらいいでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
private static という変数の修飾
-
オブジェクト参照がオブジェク...
-
複数の変数を宣言する時、同時...
-
C# インスタンスの破棄
-
インスタンス参照でアクセスで...
-
「インスタンス」の意味をわか...
-
生成したインスタンスを削除す...
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
C#「オブジェクト参照が必要で...
-
C#でオブジェクトの有無を取得する
-
ファイル読み込み/書き込み速度...
-
フォームの存在をチェックする方法
-
文字列を日付に変換でParseExce...
-
シングルトンパターン
-
VB.netで標準モジュールからフ...
-
VB6.0のクラスで、自分自身のイ...
-
カンマ区切りの数値文字列を数...
-
C# のインスタンスの破棄
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
オブジェクト参照がオブジェク...
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
変数の参照でエラーが出てしま...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
文字列を日付に変換でParseExce...
-
javaのクラスの作り方、エラー...
-
フォームの存在をチェックする方法
-
newしないインスタンス?実体化...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
-
他のファイルの変数参照
-
VB6.0で、DLLを動的に参照したい
おすすめ情報