首页 > 解决方案 > 结构内向量的初始化

问题描述

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包含两个指针向量的实例。

我的问题如下:
如何将这两个向量初始化为新的空向量?在 Java 中我会使用new关键字... C++ 中也有这样的东西吗?我问这个问题是因为如果我不以任何方式初始化它们,当我在函数中 printf 这两个向量geomap_delete的大小时geopointList,它的大小应该是 0,但它的大小georectangleList是大随机数。在我看来,只有第一个向量被初始化。

另一个问题...
如果开始在向量中添加很多东西,这些向量将开始增长。它们的大小是否可能会变得大于结构本身的大小?结构会realloc吗?

标签: c++vectorstructinitialization

解决方案


您可以将代码简化为

#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,freenew.delete

“如何将这两个向量初始化为新的空向量?” 默认构造函数为您执行此操作。

“它们的大小是否可能会变得大于结构本身的大小?结构是否会变为```realloc`”结构具有固定大小并包含两个向量。两个向量都包含指向结构外部动态内存的引用/指针。结构和两个向量都是在堆栈上创建的(在我的示例代码中),并且向量的动态内存在堆上。


推荐阅读