在矢量 c++ 中使用指针成员初始化对象

Initialize Object with Pointer Members in a Vector c++

本文关键字:指针 成员 初始化 对象 c++      更新时间:2023-10-16
我希望在使用

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;
}

@KonradRudolph是正确的 - Array没有理由在这里成为指针,它只是混淆了代码。

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

请查看五法则(在C++11之前是三法则)。

就将建筑对象添加到容器时而言,您是否使用 C++11?如果是这样,您可以在添加容器时emplace_back并构造容器中的对象 - 这是您要做的吗?

这个微不足道的例子只给了我一个叮当的警告:

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.
#include <iostream>
using namespace std;
// constructors examples 
class myClass 
{
    private:
        int* data;
    public:
        //constructor 
        myClass(int value)
        {
            data = new int ;
            *data = value ;
        } 
        //copy constructor 
        myClass (const myClass& other)
            :myClass(*other.data)
        {
                
        }
        //move constructor 
        myClass (myClass&& other)
            :data(other.data)
        {
            other.data = nullptr ;
             
        }
        //destructor 
        ~myClass ()
        {
            delete data ;
            
        }
        //copy assignment 
        myClass& operator=(myClass other)
        {
            std::swap (data, other.data);   
            return *this ;
        }
};
int main ()
{
    myClass M1(5);
    myClass M2=M1;
    myClass M3(M2);
    M1 = M3;
    myClass M4(std::move(M1));
    return 0;
}