C++ STL向量调用的是未分配对象的析构函数吗?
以下代码显示了不期望的输出:C++ STL向量调用的是未分配对象的析构函数吗?,c++,stl,vector,C++,Stl,Vector,以下代码显示了不期望的输出: class test { public: test() { std::cout << "Created" << (long)this << std::endl; } ~test() { std::cout << "Destroyed" << (long)this << std::endl; } }; int
class test
{
public:
test()
{
std::cout << "Created" << (long)this << std::endl;
}
~test()
{
std::cout << "Destroyed" << (long)this << std::endl;
}
};
int main(int argc, char** argv)
{
std::vector<test> v;
test t;
v.push_back(t);
return EXIT_SUCCESS;
}
我认为第二个“被破坏”的输出不应该存在。当我不使用向量时,结果是一条创建的线和一条破坏的线。这种行为正常吗
(这是在FreeBSD系统上用GCC编译的)一切都是它应该的:有一个局部变量
t
,它在main()
的末尾被创建和销毁,还有一个v[0]
,它在main()
的末尾被创建和销毁
您看不到创建v[0]
,因为这是通过复制或移动构造函数实现的,而您的测试类没有提供。(因此编译器为您提供了一个,但没有输出。)
出于测试目的,您可以一次性编写一个测试类,该类包含所有可能的构造函数、析构函数、赋值和交换运算符,并在每个类中打印一行诊断代码,这样您就可以见证对象在容器和算法中使用时的行为
#include <cstdlib>
#include <vector>
#include <iostream>
class test
{
public:
test()
{
std::cout << "Created " << (long)this << std::endl;
}
test( const test& )
{
std::cout << "Copied " << (long)this << std::endl;
}
~test()
{
std::cout << "Destroyed " << (long)this << std::endl;
}
};
int main(int argc, char** argv)
{
std::vector<test> v;
test t;
v.push_back(t);
return EXIT_SUCCESS;
}
std::vector::push_back
复制t
对象,您可以看到上面的代码正在调用复制构造函数。该向量包含t
的副本,因此在调用push_back
后,您有两个版本的t
。。。一个在堆栈上,一个在向量中。由于矢量版本是由复制构造函数创建的,因此您不会看到针对该对象的“已创建…”提示。。。但是当向量容器超出范围时,它仍然必须被销毁,因此您会收到两条“已销毁…”消息。+1对于要打印的指针,最好强制转换为无效指针:std::cout也返回EXIT\u SUCCESS
是可选的。您可以省略main
中的返回值,它将返回0
(对于您的平台,它将变成表示“正常终止”的数字)这是可以的。编译器提供了test(const-test&)正在调用代码>。它不能是移动构造函数
@Namaz:Right。要使用move构造函数,您必须说eitherv.push_-back(std::move(t))
,或v.push_-back(test())
。不过,两者都会创建类似的消息序列。
#include <cstdlib>
#include <vector>
#include <iostream>
class test
{
public:
test()
{
std::cout << "Created " << (long)this << std::endl;
}
test( const test& )
{
std::cout << "Copied " << (long)this << std::endl;
}
~test()
{
std::cout << "Destroyed " << (long)this << std::endl;
}
};
int main(int argc, char** argv)
{
std::vector<test> v;
test t;
v.push_back(t);
return EXIT_SUCCESS;
}
Created -1076546929
Copied 147865608
Destroyed -1076546929
Destroyed 147865608