结构内向量的初始化

Initialization of a vector inside a struct

本文关键字:初始化 向量 结构      更新时间:2023-10-16
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("%lun", m->geopointList.size());
for (int i = 0; i < m->geopointList.size(); i++) {
free(m->geopointList[i]);
}
printf("%lun", 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++也有这样的事情吗? 我问这个问题是因为如果我不以任何方式初始化它们,当我在geomap_delete函数中打印这两个向量的大小时,geopointList的大小应该是 0,但georectangleList的大小是一个很大的随机数。在我看来,只有第一个向量被初始化。

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

您可以将代码简化为

#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';
}

以避免此类问题。避免动态内存分配和释放。不要使用mallocfreenewdelete

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

"它们的大小是否有可能变得比结构本身的大小更大?结构是否要转到"realloc">该结构具有固定大小并包含两个向量。这两个向量都包含指向结构外部动态内存的引用/指针。结构和两个向量都是在堆栈上创建的(在我的示例代码中(,向量的动态内存在堆上。