当我使用 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/