【问题标题】:Object Returned from Function Calls Destructor从函数调用析构函数返回的对象
【发布时间】:2015-05-02 03:56:37
【问题描述】:

C++ 中,我有一个按值返回一流对象的函数,如下所示:

Image Video::getFrame(int frame) {
    Image img(...);

    ... processing ...

    return img;
}

在返回值并且img 超出范围后,将调用Image 析构函数,销毁对象内的所有数据。因此,每当我这样做时:

Image frame = video.getFrame(10);

frame 看起来好像完全未初始化。

我认为按值返回应该是一个完整的、单独的 img 副本。不知何故,我误解了发生了什么。我该如何克服这个问题?

注意:Image 中的成员变量都不是指针。

【问题讨论】:

  • 您如何确定frame 未初始化?
  • @0x499602D2 我说“看起来好像完全未初始化”。这是因为在函数getFrame() 返回后调用了Image::~Image()
  • 在我看来 Image 是你自己的类,你需要指定复制构造函数。如果你用谷歌搜索“复制构造函数”,你会发现原因。
  • @Oliver:这怎么可能?如果您按值返回对象,则会发生这种情况(假设没有移动构造函数在起作用):1)调用复制构造函数->您将创建第二个对象。 2)第一个对象被销毁(这就是调用析构函数的原因)。但也许我不明白你的问题。尝试添加您的复制构造函数代码以及未初始化的内容。
  • 2Oliver:在那种情况下,我无法再帮你了。您发布的代码对我来说似乎很好。所以可能还有其他错误。尝试添加更多代码...

标签: c++ function object return destructor


【解决方案1】:

我刚刚发现了原因。一个微小的差异,结果却是一个大问题。 frame 的类型为 Image* 而不是 Image。因此,它指向函数内部的img 变量,而不是复制其数据。调用析构函数时,该变量指向的数据被销毁。

我知道这没有意义......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2017-08-06
    • 2015-12-14
    • 2015-12-14
    • 1970-01-01
    • 2013-08-20
    • 2010-10-14
    相关资源
    最近更新 更多