STL容器和析构函数 注意事项

        • 局部变量存入容器会调用拷贝构造函数而后存放在堆区生命周期变长
        • 容器调用clearerase或者容器离开作用域会调用元素的析构函数
        • 容器存放对象指针并不会调用析构函数

假设有一个类如下:

class Foo
{
 public:
     Foo(int n_){
         n = n_;
         printf("Foo()  %d\n", n);
     }
     Foo(const Foo & foo){
         printf("copy-constructor\n");
         n = foo.n;
     }
     ~Foo(){
         printf("~Foo    %d\n", n);
     }
     int print(){
         printf("I will never die\n");
         return 0;                     
     }
     int n;
};

局部变量存入容器会调用拷贝构造函数而后存放在堆区,生命周期变长。

有如下代码:

std::vector vec_foo;
{
    Foo f1(1) ;
    Foo f2(2) ;
    printf("f1:%p\n", &f1);
    vec_foo.push_back(f1);
    vec_foo.push_back(f2);
    printf("f1:%p\n", &vec_foo[1]); // point 1
}

输出:

Foo()  1
Foo()  2
f1:0x7ffcd6184db0
copy-constructor
copy-constructor
copy-constructor
~Foo    1
f1:0x140c034
~Foo    2
~Foo    1
=====
~Foo    1
~Foo    2

容器调用clearerase或者容器离开作用域会调用元素的析构函数。

point 1后加入如下两行代码:

vec_foo.erase(vec_foo.begin());
vec_foo.clear();

运行结果如下:

Foo()  1
Foo()  2
f1:0x7ffcd6184db0
copy-constructor
copy-constructor
copy-constructor
~Foo    1
f1:0x140c034
~Foo    2
~Foo    1
~Foo    1
~Foo    2
=====

容器存放对象指针,并不会调用析构函数

有如下代码

Foo* f1 = new Foo(1);
Foo* f2 = new Foo(2);
std::vector vec_foo;
vec_foo.push_back(f1);
vec_foo.push_back(f2);
vec_foo.erase(vec_foo.begin());
vec_foo.clear();
f1->print();
f2->print();
printf("=====\n");

运行结果如下:

Foo()  1
Foo()  2
I will never die
I will never die
=====

你可能感兴趣的:(C++,C++,STL,析构函数)