如何删除部分课程?

Vic*_*tin 3 c++ oop

问题很简单。我有一个可以结构如下的类:

class MyClass {
  struct A {
    // ...
  };
  struct B {
    // ...
  };
};

Run Code Online (Sandbox Code Playgroud)

问题是:MyClass::B经过一段时间的预计算后,里面的信息是没有用的,而MyClass::A绝不能删除(程序可能运行了好几天)。MyClass::B掌握着相当大量的信息。我想摆脱,MyClass::B同时保持MyClass::A在相同的记忆位置。

是否可以在不修改太多数据结构并且不必添加任何其他内容MyClass::A(特别是指向 的指针MyClass::B)的情况下执行此操作?如果是这样,实施它的正确方法是什么?考虑到程序必须尽可能节省内存(让我们把它发挥到极致)。我使用 C++14 顺便说一句。

(还有额外的问题:是否可以删除对应于MyClass::Bfrom的块MyClass?)

chu*_*ill 7

首先或全部是类声明。您不能删除类声明的一部分。你可能有更多这样的事情:

// The exact place of the declaration doesn't matter actually
class A {...}; 
class B {...};

class C {
    A a;
    B b;
}; 
Run Code Online (Sandbox Code Playgroud)

只需将其更改为使用指针(在当今时代是智能指针,例如std::unique_ptr):

class C {
    A a;
    std::unique_ptr<B> b;

    void FinishTaskThatRequiredB() {
        b.reset(); // calls B::~B() and frees the memory.
    }
}; 
Run Code Online (Sandbox Code Playgroud)

  • @VictorMartin 让我们简单一点:要么 B 的生命周期与 MyClass 的生命周期相关,要么它是独立的。在后一种情况下,您必须以某种方式跟踪它。 (5认同)
  • @VictorMartin _因为我个人觉得它有点丑陋和不必要_ - 抱歉,但这是不使用某些东西的一个非常错误的理由。指针在 C++ 中无处不在,在处理动态数据时无法避免它们。至于您的问题,要么“B”的子对象将在相应的“MyClass”对象的整个生命周期中占据其空间,要么您将使用指针。你不能两者兼得。 (3认同)