识别对复制构造函数的隐藏调用
Identifying hidden calls to copy constructor
我正在通过在构造函数和析构函数中放置一些打印输出来测试我的一些处理节点的代码,我意识到有 3 个隐藏的调用来复制构造函数。但是,查看代码,我只能确定为什么会发生 2 个隐藏调用,而不是第三个。
每个Node
都有其识别级别和其他一些数据。我有一个 Singleton 类,从某种意义上说,可以为每个不同的级别创建单例dummy
,然后使用对单例的引用。代码如下:
class Node{
public:
Node(...) {
myNumber = Node::counter++;
std::cout << "constructing Node: " << myNumber << std::endl;
...
} // normal constructor
~Node() {
std::cout << "deleting Node: " << myNumber << std::endl;
}
static Node &dummy(int level);
private:
static int counter;
int myNumber;
bool isDummy;
static std::map<int, Node> dummies;
Node(int level) {
myNumber = Node::counter++;
std::cout << "constructing dNode: " << myNumber << std::endl;
..
} // private constructor, just for dummies
};
int Node::counter = 0;
Node& Node::dummy(int level){
std::map<int, Node>::iterator it;
if ((it=Node::dummies.find(level)) == Node::dummies.end()){
// no previous dummy present at this level
it = Node::dummies.insert(std::make_pair(level, Node(level))).first;
// this line invokes 3 HIDDEN CALLS TO COPY CONSTRUCTOR
}
return it->second;
}
然后,在我的(用户(代码中的某个时刻,我调用:
Node &myDummy5 = Node::dummy(5);
std::cout << "have dummy!" << std::endl;
当这是唯一的用户代码时,我得到的输出是:
constructing dNode: 0
deleting Node: 0
deleting Node: 0
deleting Node: 0
have dummy!
deleting Node: 0
我从我的输出中意识到发生了 3 个隐藏的复制构造函数调用(因为如果Node
构造不同,它将具有不同的myNumber
,而且,所有"我的"构造函数都打印输出(。
你能帮我为什么所有 3 个隐藏的电话都在发生吗?我可以猜测 2/3 的原因是:
- 调用
std::make_pair
时复制Node
在 - 执行
insert
时复制该pair
(以及随后second
Node
- ???我不知道第三个电话可能是什么
抱歉,如果代码中有任何错误,这实际上是一个更大项目的一部分,我试图只放一段最小的代码作为示例。如果发现,我会尝试纠正任何。
所有 STL 容器都使用复制语义来管理其对象。 这就是为什么在将类与 STL 容器一起使用之前,您的类支持复制构造和复制赋值是一个先决条件。 因此,在引擎盖下,std::map
正在使用副本来组织您的对象。 这就是我们所知道的,它取决于它将为给定任务复制对象的次数。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 隐藏由 WinAPI 调用创建的窗口
- 调用虚函数的逻辑不清楚(或者是方法隐藏?
- 消息框未关闭,同时关闭父级以调用隐藏或显式关闭
- 如何在调用系统()时隐藏控制台窗口
- 隐藏由 system();调用的命令提示符
- 是否可以覆盖(隐藏)非虚拟方法,但仍然从子类显式调用它
- 问题5.1-QMessageBox错误?如果在QDialog隐藏时调用了QMessageBox,则程序退出(0)
- 隐藏 sh: -c 在 c++ Linux 中调用“system”时的错误消息
- 识别对复制构造函数的隐藏调用
- 调用Fl_Double_Window的隐藏方法在多线程 FLTK C++应用程序 (Visual Studio 2010
- 隐藏调用另一个对话框的对话框
- C++这个指针,在函数调用中隐藏参数
- 如何在c++中隐藏调用系统的Matlab命令窗口和命令提示符
- backtrace-隐藏标准库和boost调用