【问题标题】:Returning an array in C++ [duplicate]在 C++ 中返回一个数组 [重复]
【发布时间】:2015-08-09 21:40:52
【问题描述】:

我正在尝试学习 C++,但有一个关于在 C++ 中返回数组的问题。我知道在这种情况下,Vector 可能会更好,并且不需要 getter 方法,因为字段在同一个类中是可见的,但我正在尝试学习内存管理,所以我会使用它们。

class Color {
    double r;
    double g;
    double b;
    public:
    Color(int a, int aa, int aaa) {
        r = a;
        g = aa;
        b = aaa;
    }

    bool operator==(const Color &other) {
        double *otherCol = other.getter();
        return otherCol[0] == r && otherCol[1] == g && otherCol[2] == b;
    }

    double* getter() const {
        double second[3] = {r,g,b};
        return second;
    }
};

int main() {
    Color col1(23, 54, 200);
    Color col2(23, 54, 200);
    cout << (col1 == col2) << endl;
    return 0;
}

如果 RGB 颜色相同,此代码应打印 1,否则打印 0。但它不会打印 1。为了调试,我在 operator== 的 return 语句之前添加了以下几行(故意两次):

cout << otherCol[0] << " " << otherCol[1] << " " << otherCol[2] << endl;
cout << otherCol[0] << " " << otherCol[1] << " " << otherCol[2] << endl;

奇怪的是,结果不一样:

23 54 200
6.91368e-310 6.91368e-310 3.11046e-317

谁能告诉我这是什么原因造成的,什么是不依赖于 Vector 或动态内存分配的合理补救措施?假设我们不想将数组传入getter() 进行更新。

【问题讨论】:

    标签: c++ arrays memory-management


    【解决方案1】:

    getter 中,您正在返回一个局部变量的地址,这会导致未定义的行为,因此您将获得随机内存。如果你返回一个指针,你必须在被调用函数中对变量进行new 和在函数返回后对变量进行delete 之类的操作。

    或者您可以将second 设为类成员,以防止其超出范围。

    您也可以将数组作为参数传入。

    【讨论】:

    • 我想我在某处读到,当从函数返回一个变量时,会创建并返回一个副本,因此即使函数超出范围,它也可以工作。为什么这里不是这样?有没有办法在没有动态内存分配的情况下做到这一点?
    • @Manbearpig 创建了一个副本,但这里是局部变量地址的副本,它在函数末尾超出范围,因此函数返回时内存位置无效。
    • 那么这只适用于非指针?因为数组只是一个指向双精度的指针,它不起作用?
    • 它适用于像int 这样的原始类型,并且如果您返回将调用返回类的复制构造函数的第一个类对象(不是指针)也适用。它从不使用指向局部变量的指针。
    • @Manbearpig 你的第一个直觉是正确的 :)
    猜你喜欢
    • 2019-09-06
    • 2012-10-02
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多