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

#c

Вопрос:

У меня есть следующий код

 struct Rectangle  {  int length;  int breadth; };  

Это известный мне метод выделения структуры в кучной памяти.

 struct Rectangle *p;  p = new Rectangle;      p-gt;length = 20;  coutlt;lt;p-gt;length;  

Комментарии:

1. Да, это выделяет память для a Rectangle (вероятно, в куче). Хотя тебе это и не нужно new struct Rectangle . Просто сделай new Rectangle это . Это не так, как в C, где у вас есть typedef свои struct s. Они typedef автоматически вводятся в C . Не забудь delete p; потом.

2. Почему бы тебе просто не попробовать это? Попробуйте этот код на компиляторе и проверьте, строится ли он и запускается ли.

3. сталкивались ли вы с какими-либо проблемами или проблемами с опубликованным кодом?

4. @kiner_shah То, что что-то строится и запускается, не означает, что это правильно/законно. Из-за концепции неопределенного поведения в C это может легко произойти.

5. @DanielLangr, согласен, но я думаю, что создание и запуск-это первый шаг при изучении какой-то новой концепции.

Ответ №1:

Это выделяет память для вашей переменной p в кучу.

Но, используя современный c , вы могли бы использовать

 auto my_rectangle=std::make_uniquelt;Rectanglegt;();  

И вы можете забыть удалить объект, так как он будет удален автоматически.

Комментарии:

1. Не забудь #include lt;memorygt;

2. Это может ввести в заблуждение, особенно для начинающих. «Это» не выделяет память для p . Он выделяет память (хранилище) для объекта типа Rectangle , а затем инициализирует объект этого типа в выделенном хранилище. Выделение памяти и инициализация объекта-это две разные вещи, и new выражение в этой форме выполняет и то, и другое. Более того, p является полностью автономным объектом. Здесь это указатель, и его хранилище (память) выделяется автоматически. Указатель и объект, на который он указывает, являются двумя отдельными объектами, что часто неправильно понимают новички.