C :将内存从对象向量释放

C++: Freeing the memory from vector of objects

本文关键字:对象 向量 释放 内存      更新时间:2023-10-16

我有这种情况,我的程序开始放慢并最终停止。我猜这是由于不以正确的方式要求记忆所致。在这种情况下,任何人都可以帮助我什么是免费的内存方法?

简化的定义:

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);
    }
}

您似乎没有任何动态内存管理(即呼叫newnew[]),因此无需做任何事情。当声明范围结束时,一切都会自动释放。

也许您有不同的问题?您可能需要使用探测器并获取一些数据。

规则很简单:任何new都必须使用delete平衡,并且任何new[]delete[]平衡。

标准的C 库容器类遵守这些规则,因此除非您已经写了newnew[]自己(您还没有),否则所有内存清理将为您完成。

任何性能问题的原因都位于其他地方:我认为这是由于您将元素推向向量的一小次(这将导致内存的多个重新分配)。也许使用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之外,可能还有其他问题。默认的内存缓冲策略是指数的。