2014-01-20 4 views
1

У меня есть функция и класс, как показано нижеПрямого вызова конструктора в C++

class Vertex { 
public: 
    int mId; 
public: 
    Vertex(int info=-1) : mId(info) { 

    } 
}; 

class Edge { 
public: 
    Vertex mStart, mEnd; 
    int mWeight; 
public: 
    Edge(Vertex start=-1, Vertex end=-1, int wt=-1) : 
     mStart(start), mEnd(end), mWeight(wt) { 
    } 
}; 

class Graph { 
    void addEdge(const Edge& e) { 
     //Adds this edge to a vector 
    } 
}; 

shared_ptr<Graph> mygraph(new Graph(13 //no of vertices 
          , 17 //no of edges 
          , false)); 

mygraph->addEdge(Edge(1, 2, 1)); 
mygraph->addEdge(Edge(3, 1, 1)); 
mygraph->addEdge(Edge(1, 6, 2)); 
mygraph->addEdge(Edge(1, 7, 4)); 
... 

Здесь я передаю прямые значения Кромочных в конструкторе и не получаю никакой аварии. Но я предполагаю, что здесь будет утечка памяти. Каков правильный способ передачи объекта по ссылке после создания?

PS: Предположим, что Vertex является неявным конструктором, принимающим int как id.

+6

Вы не использовали новые для краев -> отсутствие утечки памяти. – Borgleader

+1

Код выглядит отлично. Не будет утечки памяти, поскольку ничто не выделяется из бесплатного хранилища, кроме «Графа» в «shared_ptr» (бонусные баллы за это). – molbdnilo

+0

@molbdnilo Спасибо за комментарий. Я хотел бы подтвердить, хорошо ли этот способ построения и переход к функции без использования объектов? –

ответ

3

Там не будет никаких утечек памяти, деструкторы будут автоматически вызывается, когда @Borgleader писал

Вы не использовали новые для края -> не утечка памяти нет Если вы не называете объектов это не означает, что они не будут уничтожены. Все хорошо.

Хотя вы можете выполнить небольшую оптимизацию, если используете C++ 11. В вашем объекте кода Edge создается, а затем передается константной ссылкой на функцию addEdge(), где она будет скопирована в вектор с конструктором копирования. Вы можете избежать этих накладных расходов, используя std::vector::emplace_back! И шаблоны. Вроде так:

class Graph { 
    public: 
    template<class... Args> 
    void addEdge(Args&& ...args) { 
     //Assuming vector is std::vector<Edge> 
     vector.emplace_back(args...); 
    } 
}; 
mygraph->addEdge(1, 2, 1); 

Конечно, все созданные объекты будут автоматически уничтожены при удалении вектора.

И, кстати, если вы когда-нибудь сомневаетесь, что ваша программа имеет утечки памяти, Valgrind к вашим услугам!

Update:

Я закодирован крошечный и простой пример, показывающий разницу, увидеть его на http://ideone.com/ARzhL2. Вы можете прокрутить directrly до раздела stdout, чтобы увидеть результат.

+0

no Valgrind в Windows :( –

+0

Возможно, вы найдете это полезным: http://stackoverflow.com/questions/413477/is-there-a-good-valgrind-substitute-for-windows – mexus

Смежные вопросы