C:删除一个结构?

新手上路,请多包涵

我有一个包含指针的结构:

 struct foo
{
    char* f;
    int* d;
    wchar* m;
}

我有一个指向这些结构的共享指针向量:

 vector<shared_ptr<foo>> vec;

vec 在堆栈上分配。当它在方法结束时超出范围时,将调用其析构函数。 (对吗?)这又会调用向量中每个元素的析构函数。 (对吗?)调用 delete foo 是否只删除指针,例如 foo.f ,还是实际上从堆中释放内存?

原文由 Nick Heiner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 523
2 个回答
delete foo;

将删除分配给 foo 结构的内存,其中包括三个指针。但是只有当你实现一个显式删除它们的析构函数时,指针本身指向的内存才会被删除。

原文由 bshields 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您已动态分配 foo ,例如:

 foo* f = new foo;

然后 delete f 将销毁动态分配的 foo 对象,包括它包含的指针,但 包括指针指向的任何内容,如果它们确实指向动态分配的对象或对象数组。

如果您已将动态分配的 foo 对象(即 new foo 的结果)分配给 shared_ptr (假设 tr1 或 boost),那么当最后一个 shared_ptr 指该对象超出范围 delete 将在最初由 new foo 返回的指针上自动调用。您不必手动执行此操作。

如果您的对象( foo )包含指向它拥有的动态分配对象的指针(因此需要在 foo 的生命周期结束时解除分配),那么强烈建议您编写析构函数以正确的方式释放这些对象(这取决于它们的分配方式)。

编写析构函数后,您需要考虑是否需要编写复制构造函数和复制赋值运算符。当您使用共享指针向量时,您可能会决定不应复制您的对象。如果是这样,您可以将它们声明为私有并且不需要提供实现。

您还应该考虑一个或多个构造函数以确保您的指针成员已初始化。如果指针成员从未被初始化,那么如果它们在 foo 的生命周期内没有被分配,那么它们既不会为空,也不会指向有效的对象,这可能会导致您的析构函数出错.

原文由 CB Bailey 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题