C :将内存从对象向量释放
C++: Freeing the memory from vector of objects
我有这种情况,我的程序开始放慢并最终停止。我猜这是由于不以正确的方式要求记忆所致。在这种情况下,任何人都可以帮助我什么是免费的内存方法?
简化的定义:
typedef struct {
std::string name;
std::vector<metric_t> metrics;
} region_t;
typedef struct {
std::string name;
std::vector<region_t> regions;
} data_t;
typedef struct {
std::string name;
std::vector<double> means;
} metric_t;
主循环:
for(int i = 0; i < 100; i++)
{
data_t data;
prepare_data(&data);
/* Usage of data here */
}
准备数据功能:
void prepare_data(data_t * data)
{
region_t new_region;
data->regions.push_back(new_region);
for(int j=0; j< 100000; j++)
{
metric_t new_metric;
/* put some data in new_metric */
data->regions.back().metrics.push_back(new_metric);
}
}
您似乎没有任何动态内存管理(即呼叫new
或new[]
),因此无需做任何事情。当声明范围结束时,一切都会自动释放。
也许您有不同的问题?您可能需要使用探测器并获取一些数据。
规则很简单:任何new
都必须使用delete
平衡,并且任何new[]
与delete[]
平衡。
标准的C 库容器类遵守这些规则,因此除非您已经写了new
或new[]
自己(您还没有),否则所有内存清理将为您完成。
任何性能问题的原因都位于其他地方:我认为这是由于您将元素推向向量的一小次(这将导致内存的多个重新分配)。也许使用std::list
而不是std::vector
?
不必担心data
是自动变量的事实: sizeof(data)
很小。
另外,如果可以的话,请避免使用_t
后缀:posix删除了(尽管许多人不给季度,因为C 标准 die 允许您这样做)。另外,C 中的struct
定义不需要typedef
。
您没有任何内存操作问题。std::vector
正在为您做所有事情。但是,这应该给您更好的表现:
void prepare_data(data_t * data){
region_t new_region;
data->regions.push_back(new_region);
data->regions.back().metrics.reserve(100000);
for(int j=0; j< 100000; j++){
metric_t new_metric;
/* put some data in new_metric */
data->regions.back().metrics.push_back(new_metric);
//data->regions.back().metrics.emplace_back(a1,a2,...); if you can construct metric_t directly here it would be better
}
}
要知道您是在泄漏内存是否使用某些工具来监视过程资源使用您的操作系统(例如linux
上的htop
)或代码分析仪(例如,linux
上的valgrind
)。
除了将reserve()
推回CC_22之外,可能还有其他问题。默认的内存缓冲策略是指数的。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?