Что касается области видимости в C ++ с новым оператором

0

Если я объявляю объект в основном, тогда вызывайте эту функцию класса (хотя внутри функции я использую оператор new для объявления объекта другого класса), будет ли этот вложенный объект оставаться в области видимости после вызова функции-члена? другими словами, могу ли я использовать этот объект по-прежнему на главном? Я собирался создать вектор указателей и назначить каждой позиции новый объект, созданный вызовом функции класса.

Заранее спасибо! Пожалуйста, дайте мне знать, если мой вопрос нечеткий. PS Если я должен определить деструктор в файле.h, чтобы удалить то, что было создано с новым, правильно? Компилятор автоматически выполняет это?

int main()
{
  Ship *list[5] = { 0, 0, 0, 0, 0 };
  char ch;
  int x1,y1,x2,y2;
  int n = 0;

  cin >> ch >> x1 >> y1 >> x2 >> y2;
  while ( cin )
  {
    try
    {
      Ship *p = Ship::makeShip(ch,x1,y1,x2,y2);
      list[n++] = p;
    }

В моей программе makeShip возвращает указатель на новый объект корабля. Почему я могу использовать объект "Корабль" во всей моей основной()? Я думал, что это выходит за рамки после второй} окончательной скобки для попытки? Благодарю!!

  • 1
    Вы могли бы сделать свой вопрос менее размытым, показав код
  • 0
    Чтобы сделать это простым, выделите новую память, чтобы, если вы не потеряли адрес, вы могли использовать объект из любой точки вашей программы, пока не удалите его или не потеряете (утечка памяти).
Показать ещё 3 комментария
Теги:
scope
arrays
constructor
destructor

2 ответа

1

В этом случае это зависит от реализации Ship::makeShip.

  1. Если makeShip хранит указатель на некоторое хранилище (например, static std::vector указателей std::unique_ptr), тогда память будет удалена после выхода из программы. В этом случае вам не нужно удалять list вручную, потому что у вас есть только ссылки.
  2. Ship::makeShip возвращает указатель, который необходимо удалить вручную. В этом случае для всех элементов списка delete оператор должен быть вызван.

И последний,

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

Лучше вернуться, например, std::unique_ptr или std::shared_ptr.

В первом случае ясно, что вы становитесь владельцем указателя. Во втором случае не имеет значения, кто владеет, поскольку совместное владение

  • 0
    Я еще не настолько продвинут в C ++, но спасибо. Можете ли вы уточнить, что вы сказали для № 1? Я в основном понял из этого поста, что все, что создано с помощью New, будет иметь глобальную область действия до конца программы или до тех пор, пока не будет вызван оператор delete?
  • 0
    если вы используете новый оператор, то память может быть освобождена только при вызове оператора удаления или когда модуль умирает (выход из exe-файла или выгрузка библиотеки dll)
1

Все, что создано с new остается в живых до тех пор, пока вы не уничтожите его delete. Таким образом, объект остается в области видимости и до тех пор, пока у вас есть ссылка на ссылку на объект, вы можете получить к нему доступ.

После использования функции " } исключаются только automatic переменные. В вашем случае вы можете получить доступ к объектам Ship через list.

Хотя я бы порекомендовал std::array<Ship> или std::vector<Ship> вместо Ship *[]

РЕДАКТИРОВАТЬ
После того, как ваш вопрос будет отредактирован и добавлен раздел кода, будет ли объем объектов Ship заканчиваться после } или нет, зависит от того, что и как возвращает Ship::makeShip.

  • 0
    Я думаю, это отвечает на мой вопрос! Кроме того, объект не уничтожается автоматически, даже если у меня в классе есть деструктор, верно? Мне нужно написать код удаления?
  • 0
    Большое спасибо! Я ценю это. Так относится ли ваш ответ к моему вопросу? Если я вызываю new внутри функции внутри main, этот новый объект имеет глобальную область видимости?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню