C ++为实例变量分配const引用(内存问题?)

时间:2015-06-09 11:53:10

标签: c++ memory-management reference stack instance-variables

我一直以为引用在功能上与指针相同,它们只是有一个更友好的语法,还有一些其他的小差别(引用不能分配给null,它们不能被重新分配)。

但是今天我看到了这段代码,我不明白为什么它是正确的:

有简单的结构,Color3B。我们在堆栈上创建一个这样的:

Color3B color(255,0,0);

还有另一个类,其实例变量之一是Color3B类型。

class Node{

private:
    Color3B _color;
public:
    void setColor(const Color3B& color){
        _color = color;
    }
};

用法:

void someFunction(){
    Color3B color(255,0,0);   
    _someNode->setColor(color);    
}

我认为当颜色超出范围时会破坏颜色:当某些功能结束时。但是setColor获取在堆栈上创建的东西的内存地址,并存储它。但是没有问题,当我访问Node的_color时,它始终存在且具有正确的值。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

_color = color;获取color的值副本,因此color最终超出范围无关紧要。

如果成员变量_color 本身是引用,则会出现问题。

答案 1 :(得分:0)

                LineItemSerial.Cache.SetValueExt(myLS , "UsrFrame1", "xyz");
                LineItemSerial.Cache.SetValueExt(myLS , "UsrFrame2 ", "zzz");
                LineItemSerial.Cache.SetStatus(myLS , PXEntryStatus.Modified);
                LineItemSerial.Cache.Update(myLS);
                LineItemSerial.Cache.IsDirty = true;

让我们看看这里发生了什么:

  1. 创建名为void someFunction(){ Color3B color(255,0,0); // (1) _someNode->setColor(color);// (2) } // (5) void setColor(const Color3B& color){ // (2)(3) _color = color; // (4) }
  2. 的对象
  3. 通过引用color
  4. 来提供
  5. 参数setColor现在是color
  6. 的引用(别名)
  7. color的值复制到color(作业),因为_color不是参考
  8. _color被销毁

答案 2 :(得分:0)

如果_color是参考,那么您认为应该发生的错误。

class Node{

private:
    const Color3B& _color;
public:
    void setColor(const Color3B& color){
        _color = color;
    }
};

此代码会产生您期望的错误。现在,您实际上会将堆栈中颜色的地址保存到Node,并在someFunction()结束时将其销毁。但是你不这样做。您的Node有自己的Color3B对象,而不是对它的引用。因此代码_color = color实际上执行从someFunction()中的颜色到Node对象中的颜色的副本。现在,即使原始颜色被破坏,Node中的颜色仍然存在。

如果您使用指针编写setColor(),则代码的等效内容为:

void setColor(const Color3B* color){
    _color = *color;
}

因为引用不是变量的地址而是别名。所以上面代码中的color(如果它是一个引用)代表它的值,而不是地址。要获得地址,您必须写&color