让我就地注释和回答。
类猫()
{
上市:
猫()
{
a = 0; // ok: 设置变量 a,不管它在哪里
(*b) = 0; // 不正确:将整数 0 存储到 b 指向的任何位置
// 因为 b 从未被初始化为任何东西,它可以写
// 你能想象到的任何地方。如果你幸运的话,你的编译器
// 隐式地将指针初始化为零,这样你
// 至少得到一个确定性的分段违规。
}
诠释一个; // 一个整数变量存在于 Cat 被构造的任何地方
诠释* b; // 一个指针变量,无论 Cat 被构造指向哪里
// 设置为 (b = something) 的任何位置都可以是堆、堆栈、
// 映射内存,失控(就像这里)
};
int main(int argc, char* argv[])
{
猫猫1;// 在堆栈上分配 cat1,所有属性(a 和 b)都有效
// 那里。cat1.b 指向的位置不受限制。
猫* cat2 = 新猫();// 在堆上分配一个 Cat 类的对象,
// 在栈上分配一个指针变量 cat2 并存储
// 指向其中的堆分配 Cat 的指针
// 同样,cat2.b 指向的地方是不受限制的。
返回0;// 可能由于段错误而永远无法到达 ;-)
}
正如您在标题中提到的内存管理:堆栈变量超出范围时会自动销毁。cat1
即和(一只猫,一只指针)占用的空间cat2
在离开main()时会被回收。此外,对于 cat1,将调用析构函数。在您的情况下,没有显式析构函数,但如果 Cat 具有带有析构函数的属性,则会自动生成自动析构函数。
对于指针,当指针被破坏时,指向的对象不会自动破坏。如果你愿意,你应该看看像 std::auto_ptr<> (或 Qt 中的 QScopedPoiner )这样的智能指针,它为你提供了一个类似指针的对象,它确实会破坏指向的对象(通过调用 delete )当 auto_ptr 被破坏时。
当不使用智能指针时,您需要注意使用删除运算符手动破坏指向的对象。请注意在当前范围内的每个返回路径上执行此操作(例如多次返回、抛出的异常)。