Я работаю на базе кода, используя основные возможности языка c ++ 11 без поддержки стандартной библиотеки.Таким образом, все в пространстве имен std реализуется поставщиком, который больше не работает с c ++ в течение нескольких лет.
Я пытаюсь выполнить функцию очистки, которая перерабатывает выделенную память из std::vector<T*>
.
template<typename T>
void Cleanup(std::vector<T*> &v)
{
for(T*& p : v)
{
delete p;
p = nullptr;
}
}
Это вроде работает.Но я думаю, что было бы хорошо наложить некоторые ограничения на входной параметр, так что только указатель может быть передан в виде функции, например std::is_pointer<T>
в std.Любая идея, как это сделать без стандартного ввода?
#include <iostream>
#include <cstdlib>
#include <vector>
#define EOL "\n"
class A{
public:
A():data(0){}
int data;
};
class B{};
std::vector<A*> va;
std::vector<B*> vb;
int main()
{
for(int i = 0; i<3; ++i)
{
va.push_back(new A());
}
for(int i = 0; i<5; ++i)
{
vb.push_back(new B());
}
std::cout << va.size() << " : "<< vb.size() << std::endl;
Cleanup(va);
Cleanup(vb);
for(std::size_t i = 0; i<va.size(); ++i)
{
if(va[i] != nullptr)
{
std::cout << "Failed to clean : " << va[i] << "["<< va[i]->data <<"]" << EOL;
}
}
}
Любые другие предложения приветствуются.