Рассмотрим фрагмент кода в C ++:
int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x = new int [1000];
x = foo();
delete[] x;
return 0;
}
Когда создается x
, он указывает на адрес памяти.Когда вызывается foo()
, создается новый указатель y
, указывающий на другой адрес, но затем x
устанавливается на адрес, который имел y
.Поэтому, когда он удаляется, память нового адреса освобождается, но исходный адрес, который имел x
, просочился.Это правильно?
Кроме того, я внес небольшое изменение во фрагмент, вызвав delete[] x
перед вызовом foo()
, и он все еще скомпилирован и работает:
int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x = new int [1000];
delete[] x;
x = foo();
delete[] x;
return 0;
}
Означает ли это, что япредотвратить утечку?И последний вопрос: если я не инициализирую x
при объявлении, но не удаляю его преждевременно, указывает ли это на утечку памяти?Как показано ниже:
int *foo() {
int *y = new int[1000];
return y;
}
int main() {
int *x;
x = foo();
delete[] x;
return 0;
}
В качестве примечания, я понимаю, что использование вектора и / или уникальных указателей безопаснее, но мне любопытно, что касается функциональности приведенного выше кода, особенно того, что происходит, когдауказатель объявлен, но инициализирован позже.