【问题标题】:Memory handling for class with dynamically allocated memory具有动态分配内存的类的内存处理
【发布时间】:2014-07-30 08:43:18
【问题描述】:

给定一个简单的类 有一个私有成员,例如 a

double *data_series

这个成员被分配并填充了来自 qt 槽的数据,如下所示:

int channel_count = ...
data = new double[channel_count];
std::copy(input_data, input_data+channel_count, data);

在这个类的dtor中,数据ptr被删除了。

现在,这个简单的类包含检索到的小数据样本,并且这些类/帧中的每一个都被发出,然后应该由所有连接的插槽以一种好的方式处理,请注意数据 ptr 指向的数据是从未修改,只是阅读。

我不太擅长智能指针,所以首先我只连接了一个插槽,所以这不是一个大问题,我可以发出指向类的指针并在完成后删除插槽中的类。当连接多个插槽时会出现问题,只有在所有插槽都用完数据后才能删除数据指针。我不能按值发出类,因为我不想有一个一直复制数据的复制 ctor。

那么,我应该向类发出某种智能指针吗?或者我应该以某种方式使用智能指针来管理数据指针。我在这里寻找一个好的模式供我遵循。

brgds

【问题讨论】:

  • 您是否尝试过使用QSharedPointer?内存在 QSharedPointer 的最后一次引用被删除时被释放/删除。
  • 我尝试将指向类的指针作为 QSharedPointer 发出,它似乎运行良好。但是我很难找到一个好的模式,我想知道我是否应该将数据指针声明为共享指针,然后只发出类的实例......然后默认的复制运算符会自动复制 QSharedPointer 和我猜的所有其他参数...当最后一个实例被删除时,它应该删除共享指针指向的数据...
  • Qt 容器的复制构造函数不会复制数据。

标签: c++ qt smart-pointers


【解决方案1】:

由于您使用 C++ 编程,因此您应该使用容器。然后,这会为您处理所有令人讨厌的细节,并且很简单。

class Class : public QObject {
  Data m_data;
  ...
public:
  typedef QVector<double> Data;
  // The signal and slot declarations MUST use fully qualified types!
  Q_SIGNAL void hasData(const Class::Data &);
  ...
  Q_SLOT void processData() {
    Data localData(m_data);
    ...
    // you can modify localData here
    ...
    emit hasData(localData);
    ...
  }
}
Q_DECLARE_METATYPE(Class::Data)

int main(int argc, char ** argv)
{
  ...
  qRegisterMetatype<Class::Data>();
  ...
}

重要的是要认识到 moc 将类型视为字符串,因此您必须声明 并且 使用完全限定类型。

【讨论】:

  • 即使这个解决方案没有说明如何使用智能指针,它也为我的问题指明了正确的方向。谢谢
  • @DanielWedlund 智能指针可以解决您没有遇到的问题。在关注问题之前预设解决方案可能会适得其反。
【解决方案2】:

将 QSharedPointer 与自定义删除器一起使用。如果将其用作信号/槽参数,请在连接信号/槽之前调用 qRegisterMetatype。

以下是删除器使用示例 example

【讨论】:

  • 我使用 QSharedPointer 完成了所有工作,在我的例子中,类的析构函数释放了数据 ptr 指向的内存。多亏了 QSharedPointer,这只会发生一次。谢谢你的例子!简而言之,我要求的是一个很好的模式,可以轻松地执行 1、2 或 3:1)对类使用 QSharedPointer 2)对动态分配的成员变量使用 QSharedPointer 3)做其他事情? ? :)
  • 我会使用与任何其他常规 c++ 类相同的策略,具体取决于您的编程风格和特定情况。
猜你喜欢
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2016-05-05
  • 2013-11-21
相关资源
最近更新 更多