gpt4 book ai didi

c++ - 当我将实例添加到 vector 时,为什么会调用我的类的析构函数?

转载 作者:IT老高 更新时间:2023-10-28 21:44:52 26 4
gpt4 key购买 nike

似乎每次我向 vector m_test添加一个对象时,都会调用析构函数方法。我错过了什么吗?我怎样才能防止这种情况发生?

class TEST
{
public:
TEST();
~TEST();
int * x;
};

TEST::TEST()
{
}

TEST::~TEST()
{
... it is called every time I push_back something to the vector ...
delete x;
}

vector<TEST> m_test;
for (unsigned int i=0; i<5; i++)
{
m_test.push_back(TEST());
}

最佳答案

这里的问题是您违反了 Rule of Three .你的类有一个析构函数,所以你也需要一个复制构造函数和一个赋值运算符。或者,您不能允许复制您的类(例如,通过将 T(T const&)T& operator=(T const&) 设为私有(private),或从 boost::noncopyable 派生),然后调整 vector 的大小而不是使用 push_back .

在第一种情况下,您只需 push_back像往常一样上课。在第二种情况下,语法类似于

std::vector<TEST> vec(5);
// vec now has five default-constructed elements of type TEST.

不做这些事情是个坏主意,因为您很可能在某些时候遇到双重删除问题——即使您认为您永远不会复制或分配 TEST在哪里 x != nullptr , 明确禁止它会更安全。

顺便说一句,如果您有在对象超出范围时应该删除的成员指针,请考虑使用智能指针,如 scoped_ptr , unique_ptrshared_ptr (如果您无法使用 Boost 或 C++11,可能还有 auto_ptr)。

关于c++ - 当我将实例添加到 vector 时,为什么会调用我的类的析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9331561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com