c++ - std::array 复制语义

标签 c++ arrays c++11 copy copy-constructor

#include <array>
#include <iostream>

using namespace std;

struct SimpleDebugger
{
    SimpleDebugger(int val = 0) : x(val) {
        cout << "created" << endl;
    }

    SimpleDebugger(const SimpleDebugger &that) : x(that.x) {
        cout << "copied" << endl;
    }

    ~SimpleDebugger() {
        cout << "killed!" << endl;
    }

    int getX() const {
        return x;
    }

    void setX(int val) {
        x = val;
    }

private:
    int x;
};

array<SimpleDebugger, 3> getInts(int i)
{
    array<SimpleDebugger, 3> a;
    a[0].setX(i);
    a[1].setX(i + 1);
    a[2].setX(i + 2);
    cout << "closing getInts" << endl;
    return a;
}

SimpleDebugger (*getIntsArray(int i)) [3] {
    typedef SimpleDebugger SimpleDebugger3ElemArray [3];
    SimpleDebugger3ElemArray *sd = new SimpleDebugger3ElemArray[1];
    (*sd)[0].setX(i);
    (*sd)[1].setX(i + 1);
    (*sd)[2].setX(i + 2);
    cout << "closing getIntsArray" << endl;
    return sd;
}

ostream& operator << (ostream& os, const SimpleDebugger &sd) {
    return (cout << sd.getX());
}

int main() {
    auto x = getInts(5);
    cout << "std::array = " << x[0] << x[1] << x[2] << endl;
    auto y = getIntsArray(8);
    cout << "Raw array = " << (*y)[0] << (*y)[1] << (*y)[2] << endl;
    delete [] y;
}

输出

created
created
created
closing getInts
std::array = 567
created
created
created
closing getIntsArray
Raw array = 8910
killed!
killed!
killed!
killed!
killed!
killed!

我试过上面的程序,看看在原始数组上使用 std::array 有多方便,我知道避免使用旧式数组是很好的风格,更好的是使用 std::vector.

我想知道在 std::array 的情况下,当函数 getInts() 返回时发生了什么。对于原始数组,我知道它是一个指针拷贝,清理它的责任落在被调用者身上。在 std::array 中不会发生这种情况,但它如何在内部存储数据以及如何进行复制?

最佳答案

std::array 是一个集合,包含一个数组作为其唯一的数据成员。复制或移动一个会将数组的每个元素复制或移动到新数组中。

在您的情况下,从函数返回时拷贝被删除;在引擎盖下,数组是在 main 中的自动存储中创建的,函数会填充该数组。

关于c++ - std::array 复制语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509184/

相关文章:

php - 使用 MySQL 和 PHP 创建和使用数组

c++ - 结合使用 sizeof 和 placement new 是否安全?

c++ - x86_64-pc-cygwin-gcc 链接器错误

c - 初始化中的指针目标的符号不同

c++ - 将文本文件中的单词添加到 vector C++

c++ - 检测和调整负零

c++ - 对 `vtable for DigitalClock' 的 undefined reference - 对 `DigitalClock::staticMetaObject' 的 undefined reference - Qt

sql - Postgres |如何从包含多个 JSON 对象的 JSON 数组中提取值

c++ - CRTP编译错误

c++ - 寄存器分配算法