【发布时间】:2015-03-14 17:59:53
【问题描述】:
当我使用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;
}
【问题讨论】:
-
这里不要使用指针。这是不必要的,并且会降低代码的效率和复杂性。
-
这是对实际代码的简化,是为了让问题更容易查看/调试。实际代码必须有这些指针。
-
即使您真的需要指针,您也应该更喜欢 STL 容器中的智能指针,例如 boost::shared_ptr 或 std::shared_ptr。
-
@dbank 我想你的意思是
std::unique_ptr -
@Caleth 嗯...我不确定当我发表该评论时我的想法是什么,但是是的,我同意 unique_ptr's 将是我的智能指针的默认选择,除非有共享所有权的实际需求。
标签: c++ pointers vector constructor deep-copy