我遇到这种情况,我的程序开始变慢并最终停止。我猜这是因为没有以正确的方式声称记忆。在这种情况下,有人可以帮助我解释一下释放记忆的正确方法吗?
简化定义:
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);
}
}
答案 0 :(得分:1)
规则很简单:任何new
必须与delete
平衡,任何new[]
与delete[]
平衡。
标准C ++库容器类遵守这些规则,因此除非您自己编写new
或new[]
(您还没有),否则所有内存清理都将完成你。
任何性能问题的原因都在于其他地方:我认为这是由于将您的推送元素逐个推送到矢量(这会导致多次重新分配)记忆)。也许使用std::list
而不是std::vector
?
不要担心data
是自动变量这一事实:sizeof(data)
很小。
另外,如果可以,请避免使用_t
后缀:POSIX不允许这样做(尽管很多人都没有提供季度,因为C ++标准 允许你这样做)。此外,C ++中的typedef
定义不需要struct
。
答案 1 :(得分:1)
您似乎没有任何动态内存管理(即调用new
或new[]
),因此您无需执行任何操作。当声明范围结束时,将自动释放所有内容。
也许你有不同的问题?您可能希望使用分析器并获取一些数据。
答案 2 :(得分:1)
您没有任何内存崩溃问题。 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
}
}
答案 3 :(得分:1)
要知道您是否泄漏内存,请使用一些工具来监控操作系统具有的进程资源使用情况(例如htop
linux
)或代码分析器(例如valgrind
linux
1}})。
除了致电std::vector
之外,可能还有其他问题,而不是回到reserve()
。默认的内存缓冲区增长策略是指数级的。