Инициализация вектора внутри структуры - PullRequest
0 голосов
/ 15 января 2020
struct geopoint {
  double x;
  double y;
  const char * description;
};

struct georectangle {
  double left_x;
  double bottom_y;
  double right_x;
  double top_y;
  const char * description;
};

struct geomap {
  vector < geopoint * > geopointList;
  vector < georectangle * > georectangleList;
};

struct geomap * geomap_new() {
  struct geomap * newGeoMap = (struct geomap * ) malloc(sizeof(struct geomap));

  return newGeoMap;
}

void geomap_delete(struct geomap * m) {

  printf("%lu\n", m->geopointList.size());
  for (int i = 0; i < m->geopointList.size(); i++) {
    free(m->geopointList[i]);
  }

  printf("%lu\n", m->georectangleList.size());
  for (int i = 0; i < m->georectangleList.size(); i++) {
    free(m->georectangleList[i]);
  }

  free(m);

}

int main () {
    struct geomap * m = geomap_new();
    assert(m);
    geomap_delete(m);
}

Я новичок в C ++ и меня очень смущает инициализация объектов на этом языке ... В Java вы всегда используете ключевое слово new, когда инициализируете объект не примитивного типа. В C ++ мне кажется, что иногда конструктор по умолчанию выполняется автоматически, а иногда нет.

В приведенном выше фрагменте кода с помощью функции geomap_new() я создаю экземпляр struct geomap, который содержит два вектора указателей.

Мои вопросы следующие:
Как мне инициализировать эти два вектора, чтобы они были fre sh новыми пустыми векторами ? В Java я бы использовал ключевое слово new ... Есть ли такая вещь и в C ++? Я задаю этот вопрос, потому что, если я не инициализирую их каким-либо образом, когда я печатаю размер этих двух векторов в функции geomap_delete, размер geopointList равен 0, как и должно быть, но размер georectangleList - это большое случайное число. Мне кажется, что инициализируется только первый вектор.

Другой вопрос ...
Если начать добавлять много векторов, эти векторы начнут расти. Возможно ли, что их размер станет больше, чем размер самой структуры? Структура собирается на realloc?

1 Ответ

0 голосов
/ 15 января 2020

Вы можете упростить свой код до

#include <iostream>
#include <string>
#include <vector>

struct geopoint {
  double x;
  double y;
  std::string description;
};

struct georectangle {
  double left_x;
  double bottom_y;
  double right_x;
  double top_y;
  std::string description;
};

struct geomap {
  std::vector<geopoint> geopointList;
  std::vector<georectangle> georectangleList;
};

int main () {
    geomap m;
    std::cout << "m.geopointList.size(): " << m.geopointList.size() << '\n';
    std::cout << "m.georectangleList.size(): " << m.georectangleList.size() << '\n';
    m.geopointList.push_back({1, 2, "Description"});
    m.georectangleList.push_back({1, 2, 3, 4, "Description"});
    std::cout << "m.geopointList.size(): " << m.geopointList.size() << '\n';
    std::cout << "m.georectangleList.size(): " << m.georectangleList.size() << '\n';
}

, чтобы избежать таких проблем. Избегайте динамического выделения и освобождения памяти. Не используйте malloc, free, new и delete.

"Как я могу инициализировать эти два вектора как свободные sh новые пустые векторы?" Конструктор по умолчанию делает это за вас.

"Возможно ли, что их размер станет больше, чем размер самой структуры? Структура собирается к` `` realloc`` "" Структура имеет фиксированный размер и содержит два вектора. Оба вектора содержат ссылку / указатель на динамическую память вне структуры. Структура и оба вектора создаются в стеке (в моем примере кода), а динамическая c память векторов находится в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...