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
我的问题是:有没有办法避免使用拷贝构造函数优先队列。这会导致未定义的行为。我无法删除该功能,因为它在别处有太多的依赖关系。
答
该复制构造函数在创建比较对象时调用,该对象也是您的元素类型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));
}
如果您的复制构造函数导致UB,请修复它。 – juanchopanza
@juanchopanza在这种情况下它不。 –
您是否考虑过删除复制构造函数并使用'A(const A&)= delete'和'A&operator =(const A&)= delete;'复制赋值运算符? –