【发布时间】:2011-11-26 03:26:47
【问题描述】:
如何从方法调用中获取对象即值结果并将其放在堆上?
例如:
Qt QImage::scaledToWidth method 返回QImage 对象的副本。
我现在正在做:
QImage *new_img_on_heap = new QImage(old_imgage_on_heap->scaledToWidth(2000));
这是唯一的方法吗?当我在堆栈上已经有一个完美的好对象时,似乎正在经历制作第三个全新对象的麻烦。
我想把它放在堆上的原因是因为真正的QImage 很大,我希望它比当前方法的生命周期更长。我打算在我的类的一个字段中填充一个指向它的指针。
我知道QImage 有某种隐式数据共享,但我并不清楚它是如何工作的。另外,如果我需要使用设计不如 Qt 的对象,我想知道一个通用的解决方案。
【问题讨论】:
-
我认为复制到一个新的堆分配对象是正确的方法(无论如何需要进行堆内存分配)。我只是想知道 C++ move 将如何在幕后处理这个问题。
-
@Clodéric:如果类型是可移动的,那么它将调用移动构造函数而不是复制构造函数(参数是临时的)。我会假设
QImage对象在库的 C++0x 兼容版本中是 movable (图像缓冲区很可能保存在动态内存中) -
@DavidRodríguez-dribeas 我知道,我只是想知道它是如何在堆和堆栈之间移动对象的底层工作原理(如果可以不复制的话——我怀疑)。
-
@Clodéric:它不会移动对象,而是对象管理的资源。假设 QImage 包含一个指向字节数组的指针,那么移动构造函数可以交换源对象和目标对象中的指针。仍然会有 2 个对象,但源的内容将被 移动 到第二个对象。 same approach 可以在 C++03 中手动处理(在某些情况下),方法是创建一个空对象并使用手工定制的
swap函数。
标签: c++ heap-memory stack-memory