Итак, учитывая этот простой сценарий:
class A{
public:
A(){
n = new int(10);
}
~A(){
delete n;
}
int* n;
};
int main(){
A* a = new A();
}
Может ли это вызвать повреждение кучи (проблемы в целом), так как указатель a еще не закончил выделение, а я делаю новое выделение?
Если так, то использование std :: vector внутри конструкторов кучи также запрещено, верно?
Спасибо.
Ваш a
указатель закончил выделять.
Новое работает следующим образом (упрощенно)
Так что в вашем случае
Это игнорирует случаи, связанные с исключениями.
Нет такого понятия, как «конструктор кучи», и нет, вы не можете испортить кучу new
Память внутри конструктора объекта в куче. Память для new A
полностью выделен в то время A::A()
вызывается. То, что вы делаете, правильно и очень общий. Ваш конструктор нужен никогда заботиться о том, расположен ли создаваемый объект в стеке или куче. В противном случае указатели и классы были бы довольно бесполезны.
если «new» выдает исключение, то объект не выделяется (остерегайтесь любого выделения, сделанного ДО того, как «new» будет освобождено, иначе у вас будет выщелачивание памяти) ..
Считается, что исключения используются как система ошибок, так как конструктор не может вернуть код ошибки.
myclass::myclass()
{
param1 = new type1(); //successfull
try
{
param2= new type2(); //may fail
}
(...)
{
delete param1; //need to deallocate
}
}
Это немного излишне, я предпочитаю вообще не иметь исключений в конструкторах, некоторые люди делают целые фреймворки с конструкторами, которые могут генерировать исключения ..
в любом случае любая другая ошибка в распределителе может вызвать:
ошибка сегментации (значение доступа вне диапазона)
Повреждение кучи (перезаписать данные, которые находятся в диапазоне памяти, но которые технически не принадлежат объекту)
бесконечный цикл (необходимо прервать программу извне, иначе она никогда не выйдет из распределителя).
Это, конечно, проблема с сетью, которая может возникнуть и с обычным кодом. Распределитель по умолчанию, однако, не доставит никаких проблем, по крайней мере может вызвать исключение «недостаточно памяти». если вам не хватает оперативной памяти.