为什么vector不会在清除时调用指针的析构函数?

Raj*_*war -2 c++ vector

考虑以下两个例子

Example A:
foo a;
std::vector<foo> vec;
vec.push_back(a);
vec.clear(); //Destructor of a is called;

Example B:
foo *b = new foo();
std::vector<foo*> vec;
vec.push_back(b);
vec.clear(); //Destructor of b is not called;
Run Code Online (Sandbox Code Playgroud)

我想知道为什么在向量被清除时调用向量中对象的析构函数以及为什么在向量被清除时不调用指针的析构函数.

Lig*_*ica 5

析构函数(如果你可以称呼它)的b 调用.b是一个指针,它将像任何超出范围的其他对象一样被销毁.

但是,像其他指针一样,b超出范围并不会破坏它指向的东西.这将是非常危险和令人困惑的.这是非常慎重的:使用指针和间接的主要目的之一是防止这一点.

如果您使用C++ 11或更高版本,您可以通过切换到"智能指针"实现来实现此行为,该实现可以满足您的预期; 通过拥有指针并确保没有其他任何东西,当指针本身超出范围时,可以安全地销毁指针:

std::unique_ptr<foo> b = std::make_unique<foo>();
std::vector<std::unique_ptr<foo>> vec;
vec.push_back(b);
vec.clear();
Run Code Online (Sandbox Code Playgroud)

或更好:

std::vector<std::unique_ptr<foo>> vec;
vec.emplace_back(new foo);
vec.clear();
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,你必须迭代向量并调用delete它的所有指针,然后再清除它.