Динамическое размещение нового объекта в конструкторе

Итак, учитывая этот простой сценарий:

class A{
public:
A(){
n = new int(10);
}
~A(){
delete n;
}
int* n;
};

int main(){
A* a = new A();
}

Может ли это вызвать повреждение кучи (проблемы в целом), так как указатель a еще не закончил выделение, а я делаю новое выделение?

Если так, то использование std :: vector внутри конструкторов кучи также запрещено, верно?

Спасибо.

2

Решение

Ваш a указатель закончил выделять.

Новое работает следующим образом (упрощенно)

  • ассигновать
  • сооружать

Так что в вашем случае

  • Выделить А
  • Построить А
    • Выделить int
    • Создайте int — инициализируйте
  • Готово Построить А

Это игнорирует случаи, связанные с исключениями.

2

Другие решения

Нет такого понятия, как «конструктор кучи», и нет, вы не можете испортить кучу newПамять внутри конструктора объекта в куче. Память для new A полностью выделен в то время A::A() вызывается. То, что вы делаете, правильно и очень общий. Ваш конструктор нужен никогда заботиться о том, расположен ли создаваемый объект в стеке или куче. В противном случае указатели и классы были бы довольно бесполезны.

1

если «new» выдает исключение, то объект не выделяется (остерегайтесь любого выделения, сделанного ДО того, как «new» будет освобождено, иначе у вас будет выщелачивание памяти) ..

Считается, что исключения используются как система ошибок, так как конструктор не может вернуть код ошибки.

myclass::myclass()
{
param1 = new type1(); //successfull
try
{
param2= new type2(); //may fail
}
(...)
{
delete param1; //need to deallocate
}
}

Это немного излишне, я предпочитаю вообще не иметь исключений в конструкторах, некоторые люди делают целые фреймворки с конструкторами, которые могут генерировать исключения ..

в любом случае любая другая ошибка в распределителе может вызвать:

ошибка сегментации (значение доступа вне диапазона)

Повреждение кучи (перезаписать данные, которые находятся в диапазоне памяти, но которые технически не принадлежат объекту)

бесконечный цикл (необходимо прервать программу извне, иначе она никогда не выйдет из распределителя).

Это, конечно, проблема с сетью, которая может возникнуть и с обычным кодом. Распределитель по умолчанию, однако, не доставит никаких проблем, по крайней мере может вызвать исключение «недостаточно памяти». если вам не хватает оперативной памяти.

1
По вопросам рекламы [email protected]