C++ での思考、第 13 章: 動的オブジェクトの作成を読んでいます。この章で、void* の削除に関する Eckel の話は、おそらくバグである可能性があります。次の段落は私を混乱させます。
もう 1 つのメモリ リークの問題は、コンテナーに保持されている各オブジェクト ポインターに対して実際に delete が呼び出されるようにすることです。コンテナーはポインターを void* として保持するため、ポインターを「所有」できず、適切なクリーンアップを実行できません。オブジェクトのクリーンアップはユーザーが行う必要があります。これにより、スタック上に作成されたオブジェクトへのポインターとヒープ上に作成されたオブジェクトへのポインターを同じコンテナーに追加すると、深刻な問題が発生します。これは、ヒープ上に割り当てられていないポインターに対して削除式が安全でないためです。
「スタック上に作成されたオブジェクトとヒープ上に作成されたオブジェクトへのポインターを同じコンテナーに追加する」と深刻な問題が発生する理由を詳しく説明できる人はいますか?
問題をより明確にするために、関連するコード スニペットを追加します。
class Stack {
struct Link {
void* data;
Link* next;
void initialize(void* dat, Link* nxt);
}* head;
public:
void initialize();
void push(void* dat);
void* peek();
void* pop();
void cleanup();
};