C++使用的拷贝构造函数是由PriorityQueue中

C++使用的拷贝构造函数是由PriorityQueue中

问题描述:

我有这样的当前设置所谓的禁忌:C++使用的拷贝构造函数是由PriorityQueue中

#include <iostream> 
#include <queue> 
#include <vector> 
class A 
    { 
     int val; 
    public: 
     A() 
     { 
      std::cout << "Inside A. Constructor with val =" << val << ".\n"; 
     } 
     A(const A& msg) 
     { 
      std::cout << "Inside const A. Never want to come here. val =" << msg.val << ".\n"; 
     } 
     bool operator()(const A* m1, const A* m2) 
     { 
      std::cout << "Inside() function.\n"; 
      std::cout << "m1: " << m1->GetVal() << " m2: " << m2->GetVal()<<"\n"; 
      return (m1->GetVal() < m2->GetVal()); 
     } 
     void setVal(int input) { std::cout << "inside setVal.\n"; val = input; } 
     int GetVal()const { return val; } 

    }; 


    void specialPriorityQueue() 
    { 
     //init 
     A* val = new A(); 
     val->setVal(5); 
     std::priority_queue<A*, std::vector<A*>, A> pq; 
     pq.push(val); 

     A* val2 = new A(); 
     val2->setVal(3); 
     pq.push(val2); 

     delete val; 
     delete val2; 
    } 
int main() 
    { 
     specialPriorityQueue(); 
return 0; 
    } 

输出:

Inside A. Constructor with val =-85000000... 
inside setVal. 
Inside A. Constructor with val =-85000000... 
Inside const A. Never want to come here. val =-85000000.... 
Inside A. Constructor with val =-85000000... 
inside setVal. 
Inside const A. Never want to come here. val =-85000000.... 
Inside() function. 
m1: 5 m2: 3 

我的问题是:有没有办法避免使用拷贝构造函数优先队列。这会导致未定义的行为。我无法删除该功能,因为它在别处有太多的依赖关系。

+7

如果您的复制构造函数导致UB,请修复它。 – juanchopanza

+0

@juanchopanza在这种情况下它不。 –

+0

您是否考虑过删除复制构造函数并使用'A(const A&)= delete'和'A&operator =(const A&)= delete;'复制赋值运算符? –

该复制构造函数在创建比较对象时调用,该对象也是您的元素类型A

使用另一种类型的比较,如:

struct Compare 
{ 
    bool operator()(const A* m1, const A* m2) const { 
     return m1->GetVal() < m2->GetVal(); 
    } 
}; 

然后:

std::priority_queue<A*, std::vector<A*>, Compare> pq; 

而且,甚至更好,使用智能指针,以避免内存泄漏:

struct Compare 
{ 
    bool operator()(std::unique_ptr<A> const& m1, std::unique_ptr<A> const& m2) const { 
     return m1->GetVal() < m2->GetVal(); 
    } 
}; 

void specialPriorityQueue() { 
    std::unique_ptr<A> val(new A()); 
    val->setVal(5); 
    std::priority_queue<std::unique_ptr<A>, std::vector<std::unique_ptr<A>>, Compare> pq; 
    pq.push(move(val)); 

    std::unique_ptr<A> val2(new A()); 
    val2->setVal(3); 
    pq.push(move(val2)); 
}