C++ - 在堆上分配而不是使用新对象作为引用来维护接口(interface)

标签 c++ reference heap-memory

在我的应用程序中有一个案例,我需要根据从外部源返回的类型信息动态创建一个新对象。基本上,我有 A 类来处理这个任务。该类将创建类 B、C 或 D 等(假设 B 是基类,C 和 D 是派生类型)。然后我想将这个对象传递给一个现有的接口(interface),该接口(interface)充满了需要 B 类型引用参数的方法。最终这个动态分配的对象存储在另一个类的 boost::shared_ptr 成员对象中(我使用 reset() shared_ptr 上的方法)。所以此时内存由某人管理。

基本上,这对我来说似乎是个糟糕的设计(我将这个动态分配的对象到处传递,在某一点取消引用它,然后稍后再次获取指向它的指针)。另一方面,我不想更改接口(interface)的几个方法来获取指针而不是引用。当我将对象传递给接口(interface)以进行进一步处理时,我想单独保留该接口(interface)并取消引用指针。我在某处读到,当你有一个采用引用参数的方法时,你是在说“我不关心这里的内存管理”和“这个对象将被初始化——即不能为 NULL”。尽管该对象最初是在堆上创建的,但最终将由另一个管理其内存的类“拥有”。在这种情况下让这些接口(interface)方法采用引用参数仍然可以吗?

最佳答案

我认为在对象使用和生命周期方面设计的首要目标应该是对象的所有权在任何时候都清晰且易于理解。理想情况下,创建和删除只在一个地方处理,或者在您在其他地方创建和移交时清楚地标明 - 同样,这应该只在一个地方完成。

我的偏好是,在对象完全由某段代码拥有之前,应该使用指针。一旦拥有,所有者就可以将其作为引用传递。

  • 有了指针,可以解释为“这是一个对象 - 有人想要它吗?”
  • 对于引用,您是在说“这是我的对象 - 您可以使用它”

但如果这迫使您使其余代码变得丑陋和困惑,那么保持这种理想状态就不值得您付出代价。如果您至少可以使创建和交接看起来干净,那么您可以将古怪的东西隐藏在代码的其他(有据可查的)部分中......

B * myInst = A::BFactory( current_state_of_universe );
bool bSubmitted = SubmitForMagic( myInst );
if( !bSubmitted ) delete myInst;

关于C++ - 在堆上分配而不是使用新对象作为引用来维护接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11945135/

相关文章:

java - 当使用 -xmx 增加堆大小时,使用 netbeans 创建 .jar 文件

c++ - 高效地创建大量需要访问 "global"对象的小型 C++ 对象

c++ - 返回具有已删除移动/复制构造函数的临时类型

C++ typedef 和返回类型 : how to get the compiler to recognize the return type created with typedef?

sharepoint - 我可以在 .net 3.5 sharepoint Web 部件中使用 .net 4.0 dll 程序集引用吗?

c++ - 我可以在不使用 "new"(和隐式指针)的情况下创建在 C++ 堆上分配的对象吗?

c++ - 如何向用户显示特定错误,要求他/她使用循环再次提供输入?

objective-c - 我怎样才能在 Objective-C 中的两个类之间有引用?

java - 表达式的赋值 - 编译或运行时现象

c++ - 初始化 vector 时检查错误分配