查找被删除函数的引用位置

Finding where a deleted function is referenced

本文关键字:引用 位置 函数 删除 查找      更新时间:2023-10-16

IDE - Visual Studio Express 2013 for Desktop

c++ 11

问题-我有一个类,显然是被复制(使用复制构造函数)。如果我这样声明复制构造函数:

MyClass(const MyClass&) = delete;

它抱怨对已删除函数的引用。我已经把整个代码检查了两遍,仍然找不到类的实例要复制到哪里。

有办法找到引用的来源吗?

我已经尝试定义了复制构造函数,其中有一个断点,但它从未被击中。

<标题> 更新

对不起,它实际上显示了引用的位置-在STL中的某个分配器中。我设法将其追踪到std::vector::emplace_back()调用-它必须引起复制。我将调查此事。

更新2

我真是个笨蛋-我有一个MyClass的向量…

也许你遇到过以下的编译错误:

http://connect.microsoft.com/VisualStudio/feedback/details/889420/issue-with-delete

它说IDE (IntelliSense)抱怨而编译器没有,这就解释了为什么你没有发布任何编译器错误消息,以及为什么你可以首先执行带有断点的编译程序。

bug本身很容易重现:

struct Example
{
  Example() {}
  Example(Example const &) = delete;
};
Example f()
{
  return Example();
}
int main()
{
  Example e = f();
}

用VC 2013编译如下:

cl /nologo /EHsc /W4 /Za stackoverflow.cpp

没有错误,没有警告。

现在,如果您转到http://www.compileonline.com/compile_cpp11_online.php并使用GCC 4.7.2编译相同的代码,则是预期的编译器错误:

main.cpp: In function ‘Example f()’:
main.cpp:9:18: error: use of deleted function ‘Example::Example(const Example&)’
   return Example();
                  ^
main.cpp:4:3: error: declared here
   Example(Example const &) = delete;
   ^
main.cpp: In function ‘int main()’:
main.cpp:14:17: error: use of deleted function ‘Example::Example(const Example&)’
   Example e = f();
                 ^
main.cpp:4:3: error: declared here
   Example(Example const &) = delete;
   ^

所以,你实际上有两个问题:

  1. 你的编译器有一个bug。这只能通过升级到一个新的版本来解决,如果/当一个可用的

  2. 你的代码为一个不允许复制的类调用复制构造函数

第二个问题可以通过考虑c++"间接"复制对象的规则来解决——或者要求存在复制构造函数,即使实际的复制被优化掉了。再次检查代码,查找以下情况:
  • 按值传递。void f(MyClass obj);
  • 按值返回。MyClass f();
  • 扔。throw MyClass();

第一个很容易修复:

void f(MyClass const &obj);

其他选项需要更彻底的重新设计,因为返回或丢弃直接与防止复制的想法相矛盾。