具有动态分配内存的类的内存处理

时间:2014-07-30 08:43:19

标签: c++ qt smart-pointers

给出一个简单的课程 有一个私人成员,例如

double *data_series

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

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

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

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

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

那么,我应该发出某种类型的智能指针吗?或者我应该以某种方式使用智能指针管理数据指针。我正在寻找一个好的模式让我跟随。

brgds

2 个答案:

答案 0 :(得分:0)

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

以下是删除器使用的示例 example

答案 1 :(得分:0)

由于您使用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将类型视为字符串,因此您必须声明使用完全限定类型。

相关问题