#c #new-operator
Вопрос:
Я задаю вам вопросы, потому что есть кое-что, чего я не понимаю, изучая динамическое распределение в C .
Могу ли я удалить «St» и вместо этого использовать «ptr», если я перемещу адрес, сохраненный в St, в другой указатель «ptr», когда динамически выделяемая память указывается указателем St?
Если я удалю динамическое выделение «St», могу ли я переместить адрес в другой указатель и немедленно удалить «St», потому что выделенное пространство не исчезает, а отсоединяет указатель «St» от пространства?
Ниже приведен код, который я писал. Студент-это структура.
int main()
{
case 1:
{
Student* ptr = NULL;
Student* St = new Student[10];
ptr = St;
delete[] St;
St = NULL;
break;
}
case 2:`enter code here`
{
printdata(ptr);break;
}
}
Комментарии:
1. Вы не удаляете «указатель». Вы удаляете память, на которую она указывает. Если у вас есть два указателя, указывающих на одну и ту же память, оба они будут признаны недействительными.
2. @Yksisarvinen Я полагаю, вы это знаете, но вы можете удалить указатель, если он имеет динамическую длительность хранения, например, элемент указателя узла в связанном списке.
Ответ №1:
Как только вы вызвали delete[]
указатель , из которого вы возвращаетесь new Student[10]
, значение этого указателя не определено. Оба St
и ptr
являются именно такими, но вы переназначаетесь St
. (Начиная с C 11, используйте nullptr
вместо NULL
.)
Поведение разыменования указателя, которое вы получаете после new Student[10]
следования delete[]
, не определено.
Ответ №2:
Вы не можете использовать память, которую только что освободили. Память по этому адресу все еще может быть полезной (событие до закрытия программы), но нет никакой гарантии, и программа может использовать ее для чего-то другого.
Ответ №3:
Могу ли я удалить «St» и вместо этого использовать «ptr», если я перемещу адрес, сохраненный в St, в другой указатель «ptr», когда динамически выделяемая память указывается указателем St?
Если St указывает на ваш массив, вы также можете указать ptr на него, но это не перенос. На самом деле вы передаете адрес объекта, на который указываете. 2 указателя будут указывать на один и тот же объект.
Если вы удалите объект с помощью delete[] (вы удаляете объект, а не указатель), то 2 указателя будут указывать ни на что. Итак, что вы на самом деле хотите здесь сделать, так это указать ptr на один и тот же объект, а затем указать St на нуль.
Student* ptr = NULL;
Student* St = new Student[10];
ptr = St;
St = NULL;
Изменить : Если это может помочь вам понять, вот что вы можете отобразить …
int x = 4;
int* p = amp;x;
cout << "x = " << x << " value of x." << endl;
cout << "amp;x = " << amp;x << " adress of x." << endl;
cout << "*p = " << *p << " the value of what p points to." << endl;
cout << "p = " << p << " the actual value of p which is the adress of x." << endl;