在矢量 c++ 中使用指针成员初始化对象
Initialize Object with Pointer Members in a Vector c++
我希望在使用
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_back
但Object
没有正确的复制构造函数,因此仅复制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;
}
相关文章:
- 如果基类包含双指针成员,则派生类的构造函数
- C++正确的指针成员初始化
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 为什么 operator() 处的指针成员不起作用?
- 更改队列指针成员的值需要在 C++ 中出现奇怪的错误
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- 结构对象的指针成员在传递给函数时被修改
- 参数的混合值,当我调用指针成员函数时
- 如何正确使用结构的共享指针成员?
- C++:私有类指针成员返回未定义的值
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- 包含指针成员的嵌套结构
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- C++ 类指针成员行为奇怪(错误)
- 常量结构的指针成员
- 在类C++指针成员中
- 指针成员未在复制构造函数中初始化
- C++移动拥有指针成员的构造函数
- C++ 包含唯一指针成员变量的类的赋值运算符
- 如何使用 QPoint 指针成员对类进行排队和取消排队