Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL向量调用的是未分配对象的析构函数吗?_C++_Stl_Vector - Fatal编程技术网

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构造函数,您必须说either
v.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