释放与C ++中的结构相关联的所有内存

时间:2019-04-23 19:46:02

标签: c++ vector memory-management struct

我有一个结构,其中包含一些向量,定义如下:

#include <vector>
using namespace std;

struct data{
    vector<float> x;
    vector<float> y;
    vector<float> z;
}

以后我会这样使用:

data d;
for(int i; i<3; i++){
    d.x.push_back(i)
    d.y.push_back(i*2)
    d.z.push_back(i*3)
}

现在我想以一种完全取消分配与其关联的所有内存的方式来安全删除data。我认为,实现此目的的方法是编写一个简单的析构函数,该析构函数将清除并重新分配data的每个字段,然后delete清除对象:

struct data{
    vector<float> x;
    vector<float> y;
    vector<float> z;

    ~data(){
        vector<tempObject>().swap(x);
        vector<tempObject>().swap(y);
        vector<tempObject>().swap(z);
    }
}

然后这应该起作用:

data d;
    for(int i; i<3; i++){
        d.x.push_back(i)
        d.y.push_back(i*2)
        d.z.push_back(i*3)
    }
delete data;

我已经习惯了使用最高答案here来取消分配向量。

这项工作有效吗?如果没有,您能否描述原因和/或提出替代方案?我了解一旦d离开范围,内存将被释放,但是我需要在此之前释放内存。

3 个答案:

答案 0 :(得分:1)

struct被销毁时,其成员也将被销毁(以相反的顺序声明)。被破坏的vector将清除它们自己的内存。

不需要自定义析构函数。

答案 1 :(得分:1)

  

现在我想以一种完全释放与之关联的所有内存的方式安全删除数据。

在C ++中,具有自动,静态和动态存储持续时间的变量。在示例中,静态存储的生存期由编译器控制,因此您无法更改其生存期(小的例外是通过引用延长rvalue,但这与此处无关)。如果需要手动控制生存期,则需要创建一个具有动态存储持续时间的变量:

auto d = std::make_unique<data>();
d->x.push_back(1.0);
...
d.reset(); // terminate of lifetime of variable pointed by d manually

答案 2 :(得分:0)

不需要删除,因为您具有“数据d”作为堆栈对象。

vector(因为大多数其他stl容器都会为您进行清理)。

您也不需要为结构自定义析构函数

如果您使用现代c ++并在shared_ptr或unique_ptr上管理堆对象,则(几乎)无需使用关键字new和delete。

示例:

#include <vector>
#include <memory>

struct MyData
{
    std::vector<float> x;
    std::vector<float> y;
    std::vector<float> z;
};

int main()
{
    //example 1: stack object
    {
        MyData d;
        for(int i = 0; i<3; i++)
        {
            d.x.push_back(i);
            d.y.push_back(i*2);
            d.z.push_back(i*3);
        }
    } // scope of d ends, everything including the vectors are cleaned up


    //example 2: heap object  
    {
        std::unique_ptr<MyData> dataPtr = std::make_unique<MyData>();
        for(int i = 0; i<3; i++)
        {
            dataPtr->x.push_back(i);
            dataPtr->y.push_back(i*2);
            dataPtr->z.push_back(i*3);
        }
    } // scope of dataPtr ends, everything will be cleaned up

    //example 3: heap object, clean up within scope
    {
        std::unique_ptr<MyData> dataPtr = std::make_unique<MyData>();
        for(int i = 0; i<3; i++)
        {
            dataPtr->x.push_back(i);
            dataPtr->y.push_back(i*2);
            dataPtr->z.push_back(i*3);
        }

        dataPtr.reset(); // this will clean-up whatever the pointer points to

    } // scope of dataPtr ends, ptr itself is destoryed

}