如何找到副本的来源
How can I find the source of a copy?
我有一些使用容器的代码让我感到悲伤。问题是我想在其中一个子字段中放置一个智能指针 (unique_ptr)。例如:
struct subrecord {
int id;
int handle;
std::list<std::unique_ptr<some_really_big_record>> update; // <-- Problem field
};
struct database {
std::map <std::string, subrecord> name_subrec_map;
std::vector <std::string> a_names;
std::vector <std::string> b_names;
};
一切都编译得很好,直到我尝试添加该update
字段。一旦我这样做了,编译器就开始抱怨该unique_ptr没有可用的复制运算符。这很公平,它不应该有一个。无论如何,我并不打算复制这些地图条目。
但是,编译器没有告诉我这个副本在我的代码中来自哪里。到现在为止,已经相当多了。有什么好方法可以说吗?我尝试搜索对update
和name_subrec_map
的引用并将它们注释掉,但根本没有任何运气。唯一可以消除错误的方法是注释掉该字段本身update
。
我不想切换到shared_ptr,只是因为我找不到当副本。
如果您的代码在某处复制子记录,则它可能隐藏在您的错误消息中。
由于子记录是可移动的,但不可复制,因此您可以将其放在其标题中:
struct subrecord
{
// ...
subrecord( const subrecord & ) = delete;
subrecord( subrecord&& ) = default;
};
您甚至可以暂时注释掉列表成员,并查看在调用此副本的位置是否出现任何编译器错误。
注意:
如果您的编译器不支持删除和默认值,请将复制构造函数设为私有,但您还必须将移动构造函数设为公共。
如果这只是查找编译器错误的临时措施,则可以跳过实现它,因为您不关心链接错误。稍后将删除它,但还必须删除私有复制构造函数。
尽管您最好实现它,因为这将暴露代码中复制子记录的任何进一步尝试,而不会给任何敢于这样做的人编译器错误消息地狱。
相关文章:
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何找出GDB的SIGTRAP核心转储的根本原因
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 找不到QtResource文件中的文件
- Python中的for循环与C++有何不同
- 用callgrind追踪不必要的副本
- VC++本机单元测试,找不到调试符号
- RegGetValue在当前用户下找不到名称
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- c++找不到具有相同哈希的无序集合元素
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- 找不到以下加速库:boost_fiber
- 找不到 FLTK(缺少:FLTK_INCLUDE_DIR)
- 设置 Visual Studio for MPI: 找不到标识符错误