首页 文章

使用向量c中的指针成员初始化对象

提问于
浏览
0

当我使用 push_back() 方法时,我希望能够在对象上调用一个非平凡的构造函数 . 相反,我所能做的就是将对象的浅表副本传递给向量 . 使用常规c样式数组时,在创建数组时会自动调用构造函数,但由于向量是动态的,因此该对象尚不存在 .

如何在没有两个指针指向同一内存地址的情况下向向量添加新的空对象?我需要复制构造函数或重载赋值运算符吗?

这是一些演示我的问题的示例代码:

struct Object
{
    int *Pointer;

    Object()
    {
        Pointer = new int;
        *Pointer = 42;
    }

    ~Object()
    {
        delete Pointer;
    }
};


int main()
{
    std::vector <Object> *Array;
    Array = new std::vector <Object>;

    // Attempt 1
    Array->push_back(Object());

    // Attempt 2
    {
        Object LocalInstance;
        Array->push_back(LocalInstance);
    }

    // Error here because the destructor has already been called for 
    // LocalInstance and for Object()
    delete Array;

    return 0;
}

1 回答

  • 1

    @KonradRudolph是正确的 - 没有理由让 Array 成为这里的指针,它只是模糊了代码 .

    您的代码崩溃的原因是因为LocationInstance传递给 push_back 但您的 Object 没有正确的复制构造函数,因此只复制 Pointer 成员的浅表副本 . 当LocalInstance超出范围时,该对象将删除其 Pointer ,但容器中的副本具有相同的 Pointer ,这会在清理容器时删除释放的内存 .

    请查看Rule-of-Five(在C 11之前是三法则) .

    在将构造对象添加到容器时,对于构造对象,您使用的是C 11吗?如果是这样,你可以__36323_并在添加容器时构建容器 - 这是你想要做的吗?

    这个简单的例子只给我一个警告:

    struct A
    {
        A(int a) : member_m(a)
        {}
    
        int &member_m;
    };
    int main() {
        A a(1);
    }
    

    给我:

    ~/ClionProjects/so_reference_to_temporary $ clang++ -o test main.cpp
    main.cpp:8:25: warning: binding reference member 'member_m' to stack allocated
          parameter 'a' [-Wdangling-field]
        A(int a) : member_m(a)
                            ^
    main.cpp:13:10: note: reference member declared here
        int &member_m;
             ^
    1 warning generated.
    

相关问题