我正在阅读 C++ 中的思考,第 13 章:动态对象创建。在本章中,Eckel 谈到删除 void* 可能是一个 bug。以下段落让我感到困惑。
另一个内存泄漏问题与确保为容器中保存的每个对象指针实际调用删除有关。容器不能“拥有”指针,因为它将指针作为 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();
};