C ++:从对象向量中释放内存

时间:2016-06-22 06:55:19

标签: c++ memory-management

我遇到这种情况,我的程序开始变慢并最终停止。我猜这是因为没有以正确的方式声称记忆。在这种情况下,有人可以帮助我解释一下释放记忆的正确方法吗?

简化定义:

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

4 个答案:

答案 0 :(得分:1)

规则很简单:任何new必须与delete平衡,任何new[]delete[]平衡。

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

任何性能问题的原因都在于其他地方:我认为这是由于将您的推送元素逐个推送到矢量(这会导致多次重新分配)记忆)。也许使用std::list而不是std::vector

不要担心data自动变量这一事实:sizeof(data)很小。

另外,如果可以,请避免使用_t后缀:POSIX不允许这样做(尽管很多人都没有提供季度,因为C ++标准 允许你这样做)。此外,C ++中的typedef定义不需要struct

答案 1 :(得分:1)

您似乎没有任何动态内存管理(即调用newnew[]),因此您无需执行任何操作。当声明范围结束时,将自动释放所有内容。

也许你有不同的问题?您可能希望使用分析器并获取一些数据。

答案 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()。默认的内存缓冲区增长策略是指数级的。