Векторы делают копии на push_back. Поскольку указатель является «просто еще одной переменной» (но той, которая указывает на память), когда вы push_back целочисленный указатель, который был ранее выделен, вы копируете значение указателя в вектор, вызывая потенциальный висячий указатель, так как там будет быть двумя указателями, указывающими на одно и то же место в памяти.
В первом примере вам нужно будет удалить память вручную. Одна из стратегий, которую я использовал в прошлом для вмешательства в классы графов, - это что-то вроде этого (огромное количество материала отредактировано из-за того, что ты на работе и быстро набираешь текст):
class graph //quick-format
{
vector<node*> nodes;
add_node(node n)
{
node *temp = new node;
*temp = n;
nodes.push_back(temp)
}
~graph()
{
for(int i = 0; i < nodes.size(); i++)
delete nodes[i];
}
};
В качестве предостережения, семантика копирования графа должна быть изучена. В существующем состоянии это приведет к удалению ранее свободной памяти. Преимущество состоит в том, что у вас всегда может быть один и тот же набор узлов. Caveat Emptor , как любое прямое использование памяти ..
Однако, если вы просто нажмете переменную без указателя, не будет возможности утечки памяти с вашей стороны. Возможно, вектор утечет, но ... это практически невозможно на данном этапе зрелости инструментов.