Насколько я понимаю предмет:
Поверхностная копия — это когда не указательные типы объекта копируются в другой объект. Неглубокие копии не могут быть сделаны, когда у объекта есть указатели, потому что копируемый объект получит адрес этого указателя, а когда один из двух объектов будет удален, другой останется висящим, так как он указывает на то же место в памяти.
Глубокая копия используется, когда задействованы указатели, поскольку она резервирует пространство, отдельное от пространства исходного объекта, и просто копирует содержимое из одной ячейки памяти в другую. Таким образом, когда один из объектов удаляется, другой не остается висящим.
Тем не менее, я хотел бы знать, почему эта программа работает, хотя я сделал мелкую копию указателя
struct aStruct {
int *i;
aStruct(int *p) : i(p) {
cout << "Created aStruct" << endl;
}
aStruct(const aStruct &s) {
cout << "Copying aStruct" << endl;
i = s.i;
}
aStruct &operator=(const aStruct &s) {
cout << "Assigning aStruct" << endl;
i = s.i;
return *this;
}
};
int main() {
int *x = new int(3);
aStruct s1(x);
aStruct s2 = s1;
int *y = new int(4);
aStruct s3(y);
s3 = s1;
}
s1, s2 и s3 имеют переменную i, указывающую на одно и то же место. Так что, когда достигнут конец функции main () и одна из них уничтожена, не должны ли другие быть висячими, вызывая ошибку? Моя программа работает нормально. Может ли кто-нибудь быть настолько любезным, чтобы объяснить это мне?
Спасибо всем
Вы копируете указатель, а не данные. Каждый объект здесь представляет собой отдельный объект, кроме того, вы, похоже, находитесь под впечатлением, что C ++ является сборщиком мусора. Это не является (за исключением некоторых необычных реализаций)
Ваша программа в основном теряет память и очищается только из-за того, что ОС освобождает все, что потреблял ваш процесс после его завершения. Следовательно, все ваши указатели указывают на абсолютно правильную память на протяжении всего жизненного цикла вашего приложения.
К сожалению, в C ++ отсутствует понятие указателей Deep и Shallow. Понятие ссылок в Java и C # отличается от указателей в C ++.
Вы должны читать дальше
Скажем так, в C ++ Pointers ссылается на любой объект в памяти, на который указывает указатель.
Итак, то, что вы делаете, это копирование выделенного места в ваш конструктор в объект … Когда деструктор запускается, конечно, весь объект освобождается из памяти (мертвым), включая указатель int* i
это член данных. Но место памяти выделено new
не освобождается, пока кто-то не позвонит в то же место с delete
,