C ++自由通过结构所使用的所有存储器(C++ free all memory used by st

2019-07-29 02:15发布

快速的问题; 我已经围绕一派,找到了一些答案,但我是一个有点偏执,所以我想是肯定的。

考虑这种情况:

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

将呼叫也删除清除领域的X,Y,Z使用的内存? 一些答案,我发现提到,我刚刚删除的指针,而不是实际引用对象的这种方式。 如果...

struct CoordLocation
{
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

而如果我手动免费为结构的构造函数/析构函数内的每个对象的内存?

struct CoordLocation
{
    CoordLocation()
    {
         *X = new float;
         *Y = new float;
         *Z = new float;
    }
    ~CoordLocation()
    {
         delete X; delete Y; delete Z;
    }
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

我注意到,对于简单的情况,例如:

   float *a = new float;
   *a = 5.0f;
   printf("%f", *a);
   delete a;
   printf("%f", &a);

printf的将打印5.0,所以变量指向一个是不完全破坏。

所以我的问题是:我怎么能可靠地自由(如没有内存泄漏)ALL在这种情况下使用的结构的记忆?

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

谢谢!

Answer 1:

你只需要delete您分配内存new

printf的将打印5.0,所以变量指向一个是不完全破坏。

你的确在为未定义行为。 虽然价值仍然存在,内存被释放,可重复使用。

所以下面:

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

如果省略析构函数不能创建一个内存泄漏。

你的下一个片段:

struct CoordLocation
{
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

可以潜在地产生内存泄漏,但还不如说是。 下面将:

int main()
{
    CoordLocation *coord = new CoordLocation();
    coord->X = new float();
    delete coord;
    return 0;
}

你的第三个例子

struct CoordLocation
{
    CoordLocation()
    {
         *X = new float;
         *Y = new float;
         *Z = new float;
    }
    ~CoordLocation()
    {
         delete X; delete Y; delete Z;
    }
    float *X;
    float *Y;
    float *Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

因为你释放所有你分配的内存不会造成内存泄漏。 如果你省略析构函数或忘记调用delete coord; ,他们你有内存泄漏。

一个好的经验法则:调用delete每一个newdelete[]为每个new[]和你是安全的。



Answer 2:

在这个例子:

struct CoordLocation
{
    float X;
    float Y;
    float Z;
};

int main()
{
    CoordLocation *coord = new CoordLocation();
    delete coord;
    return 0;
}

该内存被释放 。 有在该代码没有泄漏。 在你给的例子,在你的结构包含指针,只要你释放他们在析构函数(如你在你的例子一样),不会有泄漏。

在这个片段:

float *a = new float;
*a = 5.0f;
printf("%f", *a);
delete a;
printf("%f", &a);

a停留在删除后是相同的,因为delete (荷兰国际集团)的指针只标注一个内存地址为“解放”,也不会修改其内容。 访问释放的指针是未定义的行为。



Answer 3:

本身具有自动存储时间分配的指针,没有什么自由存在。 该结构是这三个字段,当你调用它被释放delete 。 您只需拨打delete对被退回的东西new

当您分配东西,你分配足够的内存来保存它,这意味着足够的内存来容纳所有字段(和一些内部内存是实现特定的,但你不用担心这一点)。 当你删除它,你释放你分配的内存量相同。

有一件事不过要注意的是这样的情况下(在C ++中,你会不会产生一种这样的,但如相关):

struct Foo {
    char *str;
};

Foo *f = new Foo();
f->str = new char[10];

delete f;

在这种情况下,你有泄漏。 您删除f ,其中包括足够的内存来保存单个char* ,但什么是char*到已经动态分配的积分。 所以,你需要释放它太:

delete f->str;
delete f;

同样,在C ++中,你可能会没有设计类型这样一来,反而有利于像类型std::string和原则,如RAII,但例子是相关的。



文章来源: C++ free all memory used by struct