Позвольте мне аннотировать и ответить на месте.
class Cat()
{
public:
Cat()
{
a = 0; // ok: sets the variable a, wherever it lives
(*b) = 0; // not ok: stores an integer 0 to wherever b points
// since b was never initialized to anything, it can write
// anywhere you can imagine. If you are lucky, your compiler
// implicitly initializes the pointer to zero such that you
// at least get a deterministic segmentation violation.
}
int a; // an integer variable living wherever Cat gets constructed
int* b; // a pointer variable living wherever Cat gets constructed pointing
// to wherever it gets set to (b = something) could be heap, stack,
// mapped memory, out-of-control (like here)
};
int main(int argc, char* argv[])
{
Cat cat1; // allocates cat1 on the stack, all attributes (a and b) live
// there. Where cat1.b points to is unrestricted.
Cat* cat2 = new Cat(); // allocates an object of class Cat on heap,
// allocates a pointer variable cat2 on the stack and stores the
// pointer to said heap-allocated Cat in it
// again, where cat2.b points to is unrestricted.
return 0; // maybe never reached due to segfault ;-)
}
Когда вы ссылаетесь на управление памятью в вашем заголовке: переменные стека автоматически уничтожаются, когда они выходят за пределы области видимости.Т.е. пространство, занимаемое cat1
и cat2
(один Cat, один указатель) будет восстановлено при выходе из main ().Также для cat1 будет вызван деструктор.В вашем случае явного деструктора нет, но если у Cat есть атрибуты с деструкторами, автоматический деструктор будет генерироваться автоматически.
Для указателей объект, на который указывает указатель, не уничтожается автоматически при разрушении указателя.Если вы хотите этого, вы должны взглянуть на умные указатели, такие как std :: auto_ptr <> (или QScopedPoiner в Qt), который дает вам объект, похожий на указатель, который действительно разрушит указанный объект (вызывая delete для него)когда auto_ptr разрушается.
Когда не используются умные указатели, вам нужно позаботиться о том, чтобы вручную уничтожить указатели на объекты с помощью оператора delete.Позаботьтесь о том, чтобы сделать это на каждом пути возврата из вашей текущей области (многократные возвраты, сгенерированные исключения, например).