c++ - 结构内向量的初始化
问题描述
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
吗?
解决方案
您可以将代码简化为
#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
“如何将这两个向量初始化为新的空向量?” 默认构造函数为您执行此操作。
“它们的大小是否可能会变得大于结构本身的大小?结构是否会变为```realloc`”结构具有固定大小并包含两个向量。两个向量都包含指向结构外部动态内存的引用/指针。结构和两个向量都是在堆栈上创建的(在我的示例代码中),并且向量的动态内存在堆上。
推荐阅读
- arduino - MQTT 接收来自不同主题的传感器数据,但在一个有效负载中遇到
- powershell - 逐个文件捕获“Get-ChildItem”错误
- c# - 公开集合但排除部分
- teiid - 什么决定了 Teiid 会话的生命周期?
- kotlin - 如何使用 let (或 apply 等)检查 2 个条件
- c - 矩阵中数组的前两个索引被覆盖
- jquery - addClass(green) 只工作一次
- mongodb - MongoDB查询对象数组的多个字段
- angular - 来自 node_module 的 Angular Keycloak 提供程序
- http - 如何中断 HTTP 处理程序?