我有一个结构,其中包含一些向量,定义如下:
#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
留下范围,内存将被释放,但我需要在发生之前释放内存。
当struct
被摧毁时,其成员将被销毁(按照相反的声明顺序)。因此被毁坏的vector
s将清理他们自己的记忆。
不需要自定义析构函数。
现在我想安全地删除数据,完全释放与之关联的所有内存。
在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
不需要删除,因为你有“数据d”作为堆栈对象。
矢量(因为大多数其他stl容器为您处理清理)。
你也不需要为struct提供自定义析构函数
如果您使用现代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
}