c++ - 在 Vector c++ 中使用指针成员初始化对象

标签 c++ pointers vector constructor deep-copy

当我使用 push_back() 方法时,我希望能够在对象上调用一个非平凡的构造函数。相反,我所能做的就是将对象的浅表拷贝传递给 vector 。使用常规 C 风格数组时,创建数组时会自动调用构造函数,但由于 vector 是动态的,因此对象尚不存在。

如果没有两个指针指向相同的内存地址,我将如何向 vector 添加一个新的空对象?我需要复制构造函数还是重载赋值运算符?

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

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_back 但你的 Object 没有合适的复制构造函数,所以只有 的浅拷贝>Pointer 成员被复制。当 LocalInstance 超出范围时,该对象删除其 Pointer 但容器中的拷贝具有相同的 Pointer,这导致在清理容器时删除释放的内存.

请查看Rule-of-Five (在 C++11 之前是三规则)。

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

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

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.

关于c++ - 在 Vector c++ 中使用指针成员初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29052286/

相关文章:

c - 为什么在为 char 指针赋值时会出现运行时错误?

c - 如何在没有 valgrind 提示的情况下使结构指向自身

c++ - sparse_vector模板类:如何清理它?

c++ - Linux - 有时只会出现段错误 - 如何调试

c++ - 调整图片大小 vc++

c++ - 如何读取/分配指向 C++ 中结构数组的指针的元素

c++ - 生成组合的动态迭代规划

vector - 依赖模式匹配 - 压缩两个向量

c++ - 声明静态对象和指向静态对象的指针之间的区别

c++ - 使用 range-for 循环以相反的顺序迭代 vector ?